35

私はRcppモジュールを書いていますが、RcppResultSetリストの1つの要素として、要素がベクトルであるリストを返したいと思います。たとえば、.Call("myfunc")$foo次のようになります。

[[1]]
[1] 1

[[2]]
[1] 1 1

[[3]]
[1] 1 1 1

(正確な数はここでは重要ではありません)。問題は、これを行う正しいRcppの方法がわからないことです。を渡してみましたvector<vector<int> >が、これは最初のベクトルの長さを幅として黙って(行列が不規則であっても)行列を作成します。構築しようとしましたが、さまざまなオブジェクト(など)をsに安全にRcppListキャストするのに苦労しました。RcppVectorSEXP

Rcppのベクトルのリストなど、複雑な構造を処理するためのベストプラクティスに関するヒントはありますか?

4

2 に答える 2

50

[ここでこれを見るのはうれしいですが、Romainと私は一般的に質問のためにrccp-develリストをお勧めします。プロジェクトはまだそれほど大きくないので、ウェブ全体に質問を散らばらせる必要があるので、今後そこに投稿してください。]

RcppResultSetは古いクラシックAPIの一部ですが、新しいAPI(0.7。*リリース以降)と呼ばれるものに多くの作業が費やされています。CRANの現在の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に変換するのに費やしました。これは、 Rcppのバージョン0.8.3がリリースされたら(できれば数日以内に)リリースされる可能性があります。それまでの間、RQuantLibSVNアーカイブをご覧ください。

于 2010-06-21T21:50:13.060 に答える
25

私は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
于 2010-06-22T07:16:05.863 に答える