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很棒;似乎您必须通过模仿现有代码来对其进行编程。
答案 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