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

时间:2018-07-05 18:46:22

标签: rcpp

Am移植了一些具有长数据结构(超过40个项目)的C代码,并遵循了Ralf Stubner的上一个问题:In Rcpp, how to get a user-defined structure from C into R的建议。在尝试添加第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的内部工作原理。我在不真正知道它们如何执行工作的情况下调用“包装”和“创建”功能,因此,当出现问题时,很难知道如何解决问题。 Rcpp很棒;似乎您必须通过模仿现有代码来对其进行编程。

1 个答案:

答案 0 :(得分:3)

是的,有一个限制。

嵌套列表是首选解决方案。如果您确实想返回包含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