我有一个关于 Rcpp
的牵强附会的问题,我倾向于使用很多 DataFrame
对象在 xxxVector
中创建 C++
并将它们导出回 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/