У меня есть следующая проблема с модулем 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, но потом не могу подключить его к структуре S4, созданной Rcpp для класса A. Я фактически получаю внешний объект-указатель из метода в R.
Есть ли возможность вернуть корректно завернутый объект из метода второго класса?
Спасибо, Томас
[править]
В соответствии с ответом Дирка я построил оболочку, которая может создать обернутый объект 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;
}
Итак, как я могу получить внешний указатель на объект С++ из объекта S4, предоставленного в виде SEXP в списке параметров?