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?
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With