Проблема здесь , когда вы пытаетесь назначить класс. Рассмотрим следующий более минимальный пример:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List foo() {
// Setup the list
Rcpp::List result(1);
// Setup the object that will go in the list
Rcpp::IntegerVector x = Rcpp::seq(1, 10);
// Your approach was to add it to the list, THEN set the class attribute
result[0] = x;
result[0].attr("class") = "bar";
return result;
}
Вы не можете напрямую добавить класс в синтаксис доступа к элементу, подобный этому. Однако вы можете классифицировать объект, а затем добавить его в список:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List foo() {
// Setup the list
Rcpp::List result(1);
// Setup the object that will go in the list
Rcpp::IntegerVector x = Rcpp::seq(1, 10);
// Your approach was to add it to the list, THEN set the class attribute
// result[0] = x;
// result[0].attr("class") = "bar";
// What we need to do is set the class of that object
x.attr("class") = "bar";
// BEFORE adding it to the list
result[0] = x;
return result;
}
/*** R
foo()
*/
foo()
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
attr(,"class")
[1] "bar"
Обновление
Обратите внимание, что это проблема во многих других контекстах с Rcpp::List
sтакже. Рассмотрим следующее:
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List baz() {
Rcpp::List result(1);
Rcpp::IntegerVector x = Rcpp::seq(1, 10);
result[0] = x;
Rcpp::Rcout << result[0][1] << std::endl;
result[0][2] += 1;
return result;
}
Сравните это с использованием std::vector
из Rcpp::IntegerVector
с:
#include <Rcpp.h>
// [[Rcpp::export]]
void qux() {
std::vector<Rcpp::IntegerVector> result(1);
Rcpp::IntegerVector x = Rcpp::seq(1, 10);
result[0] = x;
Rcpp::Rcout << result[0][0] << std::endl;
result[0][2] += 1;
Rcpp::Rcout << result[0] << std::endl;
}
qux()
1
1 2 4 4 5 6 7 8 9 10
Как обсуждалось в нескольких местах (постарайтесь вернуться позже и добавить несколько ссылок), вам обычно нужно быть более явным, когда речь идет о Rcpp::List
, потому что его элементы могут быть почти чем угодно .