3

についてのとてつもない質問があります。私は多くのオブジェクトを使用して内で作成し、それらを にエクスポートするRcpp傾向があります。時々、次のように自分で定義する必要がある 10 個の列を処理する必要があります。DataFramexxxVectorC++R

export [[Rcpp::export]]
List myFunction(DataFrame df){
   NumericVector a = df["a"], b = df["b"], c = df["c"];
   IntegerVector a2 = df["a2"], b2 = df["b2"], c2 = df["c2"];
   CharacterVector a3 = df["a3"], b3 = df["b3"], c3 = df["c3"];

   const int N = df.nrows();
   LogicalVector out(N),out1(N);

   for(unsigned int i = 0; i<N; ++i){
      //here I do what I want to do
   }

   return(List::create(_["out"]=out, _["out1"]=out1));
}

宣言リストが複雑な名前で長い場合、宣言には時間がかかります。宣言a,b,c,...して作業することはできませんでしdf["a"],...たが、それはさらに長くなります。私の質問は(そしてそれは非常に異端かもしれません)それらのベクトル列を自動的に定義する方法はありますか?DataFrame列へのポインターのリストである があるので、それを自動化することは可能かもしれないと思いました...

4

1 に答える 1

2

これがRコードの場合、データフレームを「環境」に変えたいと思うでしょう。C++ で同様のことを行う方法が見当たりません。つまり、解釈された言語とコンパイルされた言語の違いです。

ボイラープレート コードの生成を自動化したいだけの場合は、R でそれを試してみることができます。

genDfBoilerplate <- function( coltypes, dfname="df" )
{
  ## coltypes is a named character vector with elements  "Integer", "Logical", 
  ##   "Character", etc.
  ## and names(coltypes) are the dataframe column names
  ## the name of the dataframe is dfname (default: df)
  bp = character(0)
  for( name in names(coltypes) )
  {
    decl <- sprintf('    const %sVector& %s(%s["%s"]);', coltypes[name], name, dfname, name)
    bp <- append(bp, decl)
  }
  paste(bp, sep="", collapse="\n")
}

例えば:

> coltypes = c(a="Integer", b="Numeric")
> bp = genDfBoilerplate(coltypes)
> cat(bp)
    const IntegerVector& a(df["a"]);
    const NumericVector& b(df["b"]);

(最大の効率を得るために、変数を const 参照として宣言しました。関数の詳細に応じて、明らかにこれを変更できます (たとえば、データフレームが参照によって渡され、それを変更するために列のローカル コピーが必要な場合)。 )))

定型文を Rcpp 関数コードに組み込む方法については、お任せします。コピー/貼り付けは 1 つのソリューションです。

于 2013-07-19T16:22:56.203 に答える