3

我有一个牵强的问题Rcpp,我倾向于使用大量对象在其中DataFrame创建并将它们导出回。有时我必须处理我必须定义自己的 10 列,例如:xxxVectorC++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 功能代码中,我留给您;复制/粘贴是一种解决方案。

于 2013-07-19T16:22:56.203 回答