Список итераций вылетает R - PullRequest
2 голосов
/ 19 февраля 2020

Я хотел бы сделать итерацию списка в R cpp, но этот код дает сбой R:

Rcpp::cppFunction('List foo(List bc) {

              for (List::iterator i = bc.begin(); i != bc.end(); ++i) i[0] = i[1];

              return(bc);

            }'
)

Если мы возьмем следующее foo(list(a = c(1, 2, 3, 4), b = c(4, 3, 2, 1))), R будет cra * sh. Приведенный выше пример является просто фиктивным - замените первый элемент на второй в каждом подсписке (например, мы должны получить c (2, 2, 3, 4) для a и для b c (3, 3 , 2, 1)).

Кто-нибудь может помочь? Я действительно новичок в R и R cpp и просто изучаю литературу, но понятия не имею, почему итератор не работает.

1 Ответ

4 голосов
/ 19 февраля 2020

Проблема с i[0] и i[1]. Итераторы - это своего рода указатели типа сортировки, сначала вам нужно их создать. Вот вариант вашего кода, который работает:

Код

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::List foo(Rcpp::List bc) {
  for (Rcpp::List::iterator i = bc.begin(); i != bc.end(); ++i) {
    SEXP a = *i;
    Rcpp::print(a);
  }

  return(bc);
}

/*** R
ll <- list(a = c(1, 2, 3, 4), b = c(4, 3, 2, 1))
foo(ll)
*/

Вывод

edd@rob:~/git/stackoverflow/60291024(master)$ Rscript -e 'Rcpp::sourceCpp("question.cpp")'

R> ll <- list(a = c(1, 2, 3, 4), b = c(4, 3, 2, 1))

R> foo(ll)
[1] 1 2 3 4
[1] 4 3 2 1
$a
[1] 1 2 3 4

$b
[1] 4 3 2 1

edd@rob:~/git/stackoverflow/60291024(master)$ 
...