gpt4 book ai didi

r - 附加到 Rcpp 列表中的元素

转载 作者:行者123 更新时间:2023-12-04 19:04:58 25 4
gpt4 key购买 nike

可能是一个愚蠢的问题,但我已经四处寻找答案并找不到一个:

我正在尝试编写一个文件阅读器,例如 freadread.delim但在 C++ 中实现并通过 Rcpp 连接到 R。执行此操作并让它输出 data.frame 的最简单方法是让它生成 List向量 - 每列一个 - 并将类设置为 data.frame

List foo;
foo.push_back(column);
foo.attr("class") = "data.frame";
return foo;

很简单,我以前做过。很遗憾:
  • 我想读入的文件可以有不同数量的字段;
  • 如果您按列读取文件,则此模型只能优雅地工作,而实际文件往往是按行读取的。

  • 所以,答案是能够定义 foo 然后,对于我读入的每一行, push_back() 一个字段到每个 foo 的底层向量:
    List foo(1);
    foo[0].push_back("turnip");

    不幸的是,我无法弄清楚如何做到这一点:List 的成员向量似乎不能被 push_back() 到,因为这会导致错误“Rcpp::Vector<19>::Proxy has no member named推回()”

    所以,我的问题是:有没有办法附加到 Rcpp 列表中的向量?或者我唯一的选择是逐列读取文件,将结果向量附加到“foo”,并降低由于必须迭代它[列数]次而不是一次而导致的性能成本?

    希望这个问题足够清楚。很高兴回答任何问题。

    最佳答案

    当您事先既不知道行也不知道列时,这是一个半困难的问题。

    几年前,在一个 for-work 仍然关闭的项目中,我将我的数据作为变体类型(使用相应的 Boost 类)收集并在最后进行了转换。

    Rblpapi (我贡献了一些其他代码),Whit 尝试了一些方法并最终定义了 his own helper functions我一直想提炼/重构这个并与凯文讨论——但这还没有发生。

    所以请随意想出更好的东西:)

    一般来说,回到您的问题,我们经常按行接收数据,通常是通过回调。当您逐个元素附加时,Rcpp 类型(包装 R 类型)的效果非常差——所以不要做幼稚的 push_back因为你最终会复制很多。

    所以如果你知道你的类型,做 std::list以上对应std::vector<T>对于给定的 T .这些载体你可以成长。一旦你有了它们,组装一个 Rcpp::List因此 Rcpp::DataFrame更容易。

    关于r - 附加到 Rcpp 列表中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585257/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com