我对 Rcpp 模块有以下问题:假设我在 Rcpp 模块中有两个类
class A {
public:
int x;
};
class B
public:
A get_an_a(){
A an_a();
an_a.x=3;
return an_a;
}
};
RCPP_MODULE(mod){
using namespace Rcpp ;
class_<A>("A")
.constructor()
.property("x",&A::get_x)
;
class_<B>("B)
.constructor()
.method("get_an_A",&get_an_a)
;
}
.
现在编译失败,因为它不知道如何处理 A 的返回类型。
我想我可以用 Rcpp::Xptr 做一些事情,但是,我无法将它连接到 Rcpp 为 A 类生成的 S4 结构。我实际上从 R 中的方法获得了一个外部指针对象。
是否有可能从第二类的方法中获取正确包装的对象?
谢谢,托马斯
[编辑]
根据 Dirk 的回答,我构建了一个可以创建包装的 S4 对象的包装器:
template <> SEXP wrap(const A &obj) { // insprired from "make_new_object" from Rcpp/Module.h
Rcpp::XPtr<A> xp( new A(obj), true ) ; // copy and mark as finalizable
Function maker=Environment::Rcpp_namespace()[ "cpp_object_maker"];
return maker ( typeid(A).name() , xp );
}
不过,我不知道如何将对象作为方法/函数的参数返回。以下不起作用:
template <> A* as( SEXP obj){
Rcpp::List l(obj);
Rcpp::XPtr<A> xp( (SEXP) l[".pointer"] );
return (A*) xp;
}
那么如何从参数列表中作为 SEXP 提供的 S4 对象中获取指向 C++ 对象的外部指针呢?