r - 我可以在 RCpp 中动态地从 DataFrame 列创建向量吗

标签 r rcpp

我有一个关于 Rcpp 的牵强问题,我倾向于使用很多 DataFrame 对象在 C++ 中创建 xxxVector 并将它们导出回 R。有时我必须处理 10 列,我必须像这样定义自己:

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,它是指向列的指针列表,因此可以将其自动化...

最佳答案

听起来,如果这是 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 函数代码中;复制/粘贴是一种解决方案。

关于r - 我可以在 RCpp 中动态地从 DataFrame 列创建向量吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17744104/

相关文章:

r - 在R中: add rows based on a date and another condition

r - rmarkdown 中的增量嵌套列表

r - 发现没有调用 : 'R_registerRoutines' , 'R_useDynamicSymbols' 未解决

linux - 在 AWS Red Hat Linux 上安装插入符号时出错

r - Shiny 的服务器发生错误加载命名空间没有包rcpp但安装了rcpp并在R作品中加载 Shiny

c++ - Rcpp:更改列表列表中的列表项

c++ - 自制礼帽 : looks the same but not identical

r - 匹配 switch 语句中的字符串

r - 将 data.frame 中的所有列乘以第一个

IE10 上的 R Shiny 页面