У меня есть список в R, что х<-список (с (1,2,3), с (4,5), с (5,5), с (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,2,3), c(4,5), c(5,5), c(6))
fx(x)
Пара небольших ошибок здесь:
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);
')
Других решений пока нет …