Как обработать список в R для Rcpp

У меня есть список в 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)

11

Решение

Пара небольших ошибок здесь:

  1. Две синтаксические ошибки: вам нужно Rcpp::NumericVector за yи вам не хватает точки с запятой в последнем цикле.
  2. Одно недоразумение C ++: вам нужно что-то вроде std::vector<double> res(n); как n не известно во время компиляции.
  3. Вы были слишком агрессивны / оптимистичны в создании своих векторов из списка, я сделал это в двух утверждениях.

Эта версия работает:

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);
')
23

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]