質問
RCPPモジュールを書いています。RCPPResultSetの1つの要素が、要素がベクトルであるリストをリストしたいと考えています。例えば、 .Call("myfunc")$foo
次のようなものでなければなりません:
[[1]]
[1] 1
[[2]]
[1] 1 1
[[3]]
[1] 1 1 1
(ここでは正確な数字は重要ではありません)。問題は、これを行う適切なRCPPの方法がわからないということです。渡してみました vector<vector<int> >
しかし、これは、最初のベクトルの長さを幅として静かに取ることによりマトリックスを構築します(マトリックスがぼろぼろです!)。私はアンドを構築しようとしました RcppList
しかし、さまざまなオブジェクトをキャストするのに苦労しています( RcppVector
)安全に SEXP
s。
RCPPのベクトルのリストなどの複雑な構造を扱うためのベストプラクティスに関するヒントを持っている人はいますか?
解決
ここでこれを見てうれしいですが、ロマンと私は一般的にお勧めします RCCP-Devel 質問のリスト。プロジェクトはまだそれほど大きくないので、今後の投稿を投稿してください。
RcppResultSet
年上の一部です クラシック APIは、私たちが呼んでいるものに多くの作業があったのに対して 新着 API(0.7。*リリースから始まる)。電流を見てください クランのRCPPページ ビネットのリスト - 6つとカウント。
新しいAPIを使用すると、次のようなものを返します
return Rcpp::List::create(Rcpp::Named("vec") = someVector,
Rcpp::Named("lst") = someList,
Rcpp::Named("vec2") = someOtherVector);
すべて1つのステートメント(およびおそらく明示的なものを使用します Rcpp::wrap()
呼び出し)、何を作成しますか r だろう
list(vec=someVector, lst=someList, vec2=someOtherVector)
と Rcpp::List
リストのリストのリストも作成できるはずです...これについてはユニットテストがあるかどうかはわかりませんが、500以上のユニットテストには多くの例があります。
それがたまたま、私は最後の数日間、多くのことを変えて過ごしました rquantlib クラシックAPIから新しいAPIまでのコード。これは、バージョン0.8.3を取得するとおそらくリリースされます rcpp Out(できれば数日で)。それまでの間、あなたはを見ることができます rquantlib svnアーカイブ
他のヒント
Dirkのソリューションの圧縮バリエーションを使用する傾向があります。
using namespace Rcpp ;
return List::create(
_["vec"] = someVector,
_["lst"] = someList,
_["vec2"] = someOtherVector
) ;
また、元の質問に戻るために、 vector< vector<int> >
マトリックスではなく、整数ベクトルのリストに包む必要があります。見る:
require( Rcpp )
require( inline )
require( RUnit )
fx <- cxxfunction( , '
std::vector< std::vector<int> > v ;
std::vector<int> x1(1) ; v.push_back( x1 );
std::vector<int> x2(2) ; v.push_back( x2 );
std::vector<int> x3(3) ; v.push_back( x3 );
return wrap( v ) ;
', plugin = "Rcpp" )
わかりました:
> fx()
[[1]]
[1] 0
[[2]]
[1] 0 0
[[3]]
[1] 0 0 0