在 Rcpp 中,DataFrame 或 List 中可以包含的元素数量是否有限制?

In Rcpp, is there a limit to the number of elements that may be wrapped in a DataFrame or List?

我正在移植一些具有长数据结构(40 多个项目)的 C 代码,并遵循 Ralf Stubner 在上一个问题中的建议:。在我尝试添加第 21 个元素之前一切正常:

return Rcpp::wrap(Rcpp::DataFrame::create(Rcpp::Named("institution") = x.institution, // 1st entry
    ...
    Rcpp::Named("number_of_samples") = number_of_samples, // 19th entry
    Rcpp::Named("channel_name") = x.channel_name   ));    // 20th entry

编译并运行。当我添加更多条目时,出现错误:“没有匹配函数来调用 'create'。

    Rcpp::Named("number_of_samples") = number_of_samples, // 19th entry
    Rcpp::Named("channel_name") = x.channel_name,         // 20th entry
    Rcpp::Named("channel_name2") = x.channel_name  ));    // 21st entry

我真的不想 "channel_name" 列出两次;我只是想让自己相信输入的实际值不是问题。 Rcpp 代码是否对数据框的大小有某种限制?如果不是,您将如何寻找导致此错误的原因?

关于我在上一个问题中给出的评论,像我这样的人很难调试这样的问题,因为我不太了解Rcpp的内部工作原理。我在调用 "wrap" 和 "create" 函数时并不知道它们是如何做的,所以当出现问题时很难知道如何修复。 Rcpp 很棒;看起来你必须通过模仿现有代码来编程。

是的,有一个限制。

嵌套列表是首选解决方案。如果你真的想要 return 一个包含 40 多个元素的列表,你可以尝试 here 或以下:

std::vector<std::string> names;

std::vector<SEXP> elements;

// do something with the elements and names

Rcpp::List result(elements.size());

for (size_t i = 0; i < elements.size(); ++i) {
    result[i] = elements[i];
}

result.attr("names") = Rcpp::wrap(names);
// result can be return to R as a list