i have far fetched question rcpp, tend use lot of dataframe objects create xxxvector within c++ , export r. have deal 10 columns have define myself :
export [[rcpp::export]] list myfunction(dataframe df){ numericvector = 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 = 0; i<n; ++i){ //here want } return(list::create(_["out"]=out, _["out1"]=out1)); } if declaration list long complex names declarations take ages. not declare a,b,c,... , work df["a"],... longer. question (and might heresy) there way automatically define vector columns ? thought have dataframe list of pointers columns may possible automate it...
sounds like, if r code, want turn dataframe "environment". can't see way similar in c++ -- difference between interpreted , compiled language.
if you're wanting automate generation of boilerplate code, try doing in r. along lines of
gendfboilerplate <- function( coltypes, dfname="df" ) { ## coltypes named character vector elements "integer", "logical", ## "character", etc. ## , names(coltypes) dataframe column names ## name of dataframe 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") } for example:
> coltypes = c(a="integer", b="numeric") > bp = gendfboilerplate(coltypes) > cat(bp) const integervector& a(df["a"]); const numericvector& b(df["b"]); (i've declared variables const references maximum efficiency. can modify depending on specifics of function (eg if dataframe passed reference , want local copy of column in order modify it.))
how boilerplate rcpp function code leave you; copy/paste 1 solution.
Comments
Post a Comment