将c ++对象作为指针传递给Rcpp中的另一个函数重用

Dan*_*bel 8 c++ r rcpp

假设我在C++中有以下两个函数:

// [[Rcpp::export]]
SEXP foo() {

  int a = 1;

  Rcpp::XPtr<int> ptr(&a, true);

  return ptr;
}

// [[Rcpp::export]]
int bar(SEXP a){

  Rcpp::XPtr<int> x(a);
  int b = *x;

  return b;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够在R中调用类似下面的内容.当然,在这个例子中我可以返回一个int到R in foo,但在我的原始代码中,a是一个有点复杂的数据结构,我不想只返回指针为此,它可以被另一个被调用的C++函数重用bar

a <- foo()
bar(a)
Run Code Online (Sandbox Code Playgroud)

在这个例子中我期望bar(a)返回1而不是0.我该如何解决这个问题?

cde*_*man 11

a一旦函数完成,您的初始变量就会超出范围foo.相反,你需要首先初始化你的指针,分配它,然后用它包装它XPtr.以下显示了如何执行此操作的示例.

// [[Rcpp::export]]
SEXP foo() {

  int *a = new int(1);

  Rcpp::XPtr<int> ptr(a);

  return ptr;
}
Run Code Online (Sandbox Code Playgroud)

R代码

Rcpp::sourceCpp('test.cpp')

a <- foo()
bar(a)
[1] 1
Run Code Online (Sandbox Code Playgroud)