【问题标题】:Appending to elements within an Rcpp List附加到 Rcpp 列表中的元素
【发布时间】:2014-12-20 23:18:01
【问题描述】:

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

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

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

很简单,我以前做过。不幸的是:

  1. 我要读取的文件可以有不同数量的字段;
  2. 只有在您按列读取文件时,此模型才能正常工作,而实际文件往往按行读取。

所以,答案是能够定义 foo,然后,对于我读入的每一行,push_back() 一个字段到 foo 的每个底层向量:

List foo(1);
foo[0].push_back("turnip");

不幸的是,我不知道该怎么做:似乎不能将 List 的成员向量 push_back() 到,因为这会导致错误“Rcpp::Vector::Proxy has没有名为 push_back() 的成员”

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

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

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

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

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

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

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

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

    因此,如果您知道自己的类型,请在给定的 T 对应的 std::vector<T> 上执行 std::list。这些向量你可以增长。拥有它们后,组装 Rcpp::ListRcpp::DataFrame 就更容易了。

    【讨论】:

    • 这是有道理的。总结一下;即使它表面上看起来效率低下,最有效的方法可能是反复遍历文件,将每一列依次提取为 std::vector,然后将该向量完整地添加到列表中?
    • 在许多情况下,您可以按行阅读,增加数据结构并在最后进行转换。完全一般高效做到这一点很难。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2015-02-05
    • 2014-06-10
    • 2017-12-18
    • 2017-06-23
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多