附加到Rcpp列表中的元素

时间:2014-12-20 23:18:02

标签: r rcpp

可能是一个愚蠢的问题,但是我一直在寻找答案并找不到答案:

我尝试编写文件阅读器,la 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. 如果您从列文件中读取文件,此模型只能优雅地工作,而实际文件往往是按行读取的。
  3. 所以,答案是能够定义foo然后,对于我读入的每一行,push_back()将一个字段放到foo的每个底层向量上:

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

    不幸的是,我无法解决如何做到这一点:它不会出现List的成员向量可以被push_back(),因为这会导致错误" Rcpp :: Vector< 19> :: Proxy没有名为push_back()的成员"

    所以,我的问题是:有没有办法在Rcpp列表中附加一个向量?或者是我唯一的选择,逐列读取文件,将生成的向量追加到" foo",并且不得不迭代它所产生的性能成本[列数]而不是一次?

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

1 个答案:

答案 0 :(得分:5)

如果事先既不知道行也不知道列,这是一个半难的问题。

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

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

所以请随时提出更好的建议:)

一般来说,回到你的问题,我们经常通过回拨接收数据 row-wise 。当你逐个元素追加时,Rcpp类型(包装R类型)非常差 - 所以不要做天真push_back,因为你最终会复制 a很多

因此,如果您知道自己的类型,请对std::list对应std::vector<T>的相应T Rcpp::List。你可以成长这些载体。一旦拥有它们,组装Rcpp::DataFrame因此{{1}}就更容易了。