在 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
我正在移植一些具有长数据结构(40 多个项目)的 C 代码,并遵循 Ralf Stubner 在上一个问题中的建议:
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