我对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"],...
这是列的指针列表可能是自动化它...
答案 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功能代码中;复制/粘贴是一种解决方案。