我在R中有一个列表,其中x <-list(c(1,2,3),c(4,5),c(5,c(6)).我想将列表输入到Rcpp,并将它们作为平均向量c(2,4.5,5,6)返回. 我不知道如何处理Rcpp中的列表.我收到一条错误消息,有人可以检查我的代码吗?
library(inline) fx = cxxfunction(signature(x='List'),body = ' Rcpp::List xlist(x); int n = xlist.size(); double res[n]; for(int i=0; i<n; i++) { Rcpp NumericVector y(xlist[i]); int m=y.size(); res[i]=0; for(int j=0; j<m; j++){ res[i]=res[i]+y[j] } } return(wrap(res)); ',plugin='Rcpp') x<-list(c(1,c(6)) fx(x)
解决方法
这里有几个小错误:
>两个语法错误:您需要R的Rcpp :: NumericVector,并且在最后一个循环中缺少一个分号.
>对C有一个误会:你需要像std :: vector< double> RES(n)的;因为n在编译时不知道.
>你在实例化你的向量从表中太激进/乐观,我在两个语句中做到这一点.
此版本的作品:
R> fx <- cxxfunction(signature(x='List'),plugin='Rcpp',body = ' + Rcpp::List xlist(x); + int n = xlist.size(); + std::vector<double> res(n); + + for(int i=0; i<n; i++) { + SEXP ll = xlist[i]; + Rcpp::NumericVector y(ll); + int m=y.size(); + res[i]=0; + for(int j=0; j<m; j++){ + res[i]=res[i]+y[j]; + } + } + + return(Rcpp::wrap(res)); + ') R> x<-list(c(1,c(6)) R> fx(x) [1] 6 9 10 6 R>
编辑:这是一个更加惯用的一个版本:
fx <- cxxfunction(signature(x='List'),body = ' Rcpp::List xlist(x); int n = xlist.size(); Rcpp::NumericVector res(n); for(int i=0; i<n; i++) { SEXP ll = xlist[i]; Rcpp::NumericVector y(ll); for(int j=0; j<y.size(); j++){ res[i] += y[j]; } } return(res); ')