Ответ 1
Несколько небольших ошибок здесь:
- Две синтаксические ошибки: вам нужно
Rcpp::NumericVector
дляy
, и вам не хватает точки с запятой в последнем цикле. - Одно непонимание С++: вам нужно что-то вроде
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,2,3), c(4,5), c(5,5), c(6))
R> fx(x)
[1] 6 9 10 6
R>
Изменить: вот версия, которая немного более идиоматична:
fx <- cxxfunction(signature(x='List'), plugin='Rcpp', 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);
')