2013-03-31 6 views
12

rcppのドキュメントとギャラリーのRcpp::DataFrameを参照してください。DataFrameを参照する方法を知りませんでした。私はこの記事をSOとこのアーカイブのアーカイブに載せました。 何も明らかではないので、私は "それはすでにそうだから"や "それは意味がない"のような大きなものを逃すと思う。 「それは意味がありませんので、」参照によってdata.frameを渡し、それをrcppで更新する

私がコンパイルされ、以下を試してみましたが、RでupdateDFByRefに渡されたdata.frameオブジェクトが短い答え手つかず

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
void updateDFByRef(DataFrame& df) { 
    int N = df.nrows(); 
    NumericVector newCol(N,1.); 
    df["newCol"] = newCol; 
    return; 
} 
+6

あなたはすでにリストに投稿しています。なぜここに再ポストしますか? –

答えて

12

方法DataFrame::operator[]が実際にコピーにリーズを実装されています

df["newCol"] = newCol; 

はあなたが欲しいものを行うには、データフレームは、特定の属性で、ベクトルのリストであるかを検討する必要があります。次に、ベクター(ベクターの内容ではなくポインタ)をコピーして、元のデータを取得することができます。

このようなことがあります。もう少し仕事ですが、それほど難しくありません。

// [[Rcpp::export]] 
List updateDFByRef(DataFrame& df, std::string name) { 
    int nr = df.nrows(), nc= df.size() ; 
    NumericVector newCol(nr,1.); 
    List out(nc+1) ; 
    CharacterVector onames = df.attr("names") ; 
    CharacterVector names(nc + 1) ; 
    for(int i=0; i<nc; i++) { 
     out[i] = df[i] ; 
     names[i] = onames[i] ; 
    } 
    out[nc] = newCol ; 
    names[nc] = name ; 
    out.attr("class") = df.attr("class") ; 
    out.attr("row.names") = df.attr("row.names") ; 
    out.attr("names") = names ; 
    return out ; 
} 

このアプローチに関連する問題があります。元のデータフレームと作成したデータフレームが同じベクトルを共有するため、悪いことが起こる可能性があります。あなたが何をしているのか分かっているならば、これを使うだけです。

+0

本当にありがとうございます。今はっきりしています。私は、SEXPがすでに参考になっているという基本的な知識が欠けていたと思います。 http://cran.r-project.org/doc/manuals/r-release/R-ints.pdfを見ていきます。今は、Rで 'data.table'を"準備中 "でしたので、余分な列を追加してRcpp内で更新しました。コピーはありませんでした。それははるかに良いです、私はこれを行うリスクを理解していますが、私がやっていることはうまくいきます。 Merci beaucoup。 – statquant

+0

もう一度、あなたは間違っているだけです:_私はSEXPが既に参照されているという事実のような基本的な知識が欠けていたと思います。参照ではなくポインタです。 SEXPの最後の文字が何を意味するかを調べてみてください。 –

3

滞在です。

data.frameは本質的にベクターのリストです。反射が数秒間続くと、その列に新しい列を追加するとコピーが必要になります。したがって、この例では変数dfを変更します。返さないでください。

特定の方法で作業することを願っているだけでは必ずしも十分ではありません。あなたがそれを行うとき

+0

'void'を' SEXP'で置き換える、例えば 'return df; 'はそのトリックを行いますか? – agstudy

+0

はい、SEXP、Rcpp :: ListまたはRcpp :: DataFrameのいずれかが行います。現在、リストとして戻ってきているようですので、そのデータは失われているようです。 –

+0

ありがとう。私はちょうどそれをテストし、それは魅力のように動作します!結果に 'as.data.frame'を追加すると、目的のdata.frame-nessが得られます。 – agstudy

関連する問題