问题
Suppose a I have the following 2 functions in 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;
}
I want to be able to call something like the following in R.
Of course, in this example I could return an int
to R in foo
, but in my original code, a
is a somewhat complex data structure and I wan't to return only the pointer to this, so it can be reused by another C++ function called bar
a <- foo()
bar(a)
In this example I expected that bar(a)
returned 1 instead of 0. How can I fix this?
回答1:
Your initial variable a
goes out of scope as soon as the function finishes in foo
. Instead you need to initialize your pointer first, assign it, then wrap it with the XPtr
. The following shows an example of how to do this.
// [[Rcpp::export]]
SEXP foo() {
int *a = new int(1);
Rcpp::XPtr<int> ptr(a);
return ptr;
}
R code
Rcpp::sourceCpp('test.cpp')
a <- foo()
bar(a)
[1] 1
来源:https://stackoverflow.com/questions/45947880/pass-a-c-object-as-a-pointer-an-reuse-in-another-function-in-rcpp