我可以在RCpp中动态创建DataFrame列中的向量

时间:2013-07-19 10:39:04

标签: r rcpp

我对Rcpp提出了一个很难得的问题,我倾向于使用大量DataFrame个对象在xxxVector中创建C++并将其导出回{{1} }}。有时我必须处理10个我必须自己定义的列:

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"],...这是列的指针列表可能是自动化它...

1 个答案:

答案 0 :(得分: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功能代码中;复制/粘贴是一种解决方案。