我对R有相当多的经验,但我现在才开始学习C ++,所以我请求原谅任何随之而来的愚蠢....
给出以下test.cpp文件:
#include <Rcpp.h>
#include <string>
using namespace Rcpp;
using namespace std;
XPtr< double > getPtr(NumericVector x) {
double i;
i = REAL(x)[0];
XPtr< double > p(&i, false);
XPtr<double> checkP(p);
double checkV = *checkP;
cout << "Values within getPtr scope:" << endl;
cout << "Pointer address " << hex << checkP << endl;
cout << "Pointer value " << checkV << endl;
return p;
}
// [[Rcpp::export]]
void testPtr(NumericVector x){
XPtr<double> p(getPtr(x));
cout << "Values outside of getPtr scope:" << endl;
cout << "Pointer address " << hex << p << endl;
cout << "Pointer value " << *p << endl;
return;
}
以下R片段演示了Xptr&#34;指向的值消失了#34;在getPtr函数之外。
> library(Rcpp)
> Rcpp::sourceCpp(file="test.cpp")
>
> test <- c(35,28,16,52)
> testPtr(test)
Values within getPtr scope:
Pointer address 0x7ffd3763d790
Pointer value 35
Values outside of getPtr scope:
Pointer address 0x7ffd3763d790
Pointer value 6.95277e-310
但当然!由于该值超出范围,因此这是预期的行为。
或者,如果我将值包装在类中并使用new
,则该对象仍然存在,并且我可以在被调用函数的范围之外检索我的值:
class Wrap {
public:
Wrap(double x) {
i = x;
}
double i;
};
XPtr< Wrap > getPtrW(NumericVector x) {
double i;
i = REAL(x)[0];
Wrap* w = new Wrap(i);
XPtr< Wrap > p(w, true);
return p;
}
// [[Rcpp::export]]
void testWrappedPtr(NumericVector x){
XPtr<Wrap> wp(getPtrW(x));
Wrap w = *(wp);
cout << "Wrapped value " << w.i << endl;
return;
}
然后,这表明该值仍然存在:
> testWrappedPtr(test)
Wrapped value 35
我的问题(最后)是这些:(1)这是否(即包装在一个类中)是唯一的方法来挂起基本类型的变量值而不是malloc&d; d或new&#39; d和(2)如果没有,是任何替代方式&#34;更好&#34;或&#34;首选&#34;?
提前致谢!