Rcpp モジュールには次の問題があります: Rcpp モジュールに 2 つのクラスがあるとします。
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 のメソッドから外部ポインター オブジェクトを取得します。
2 番目のクラスのメソッドから正しくラップされたオブジェクトを取得する可能性はありますか?
ありがとう、トーマス
[編集]
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++ オブジェクトへの外部ポインターを取得するにはどうすればよいでしょうか。