附加到Rcpp列表中的元素

Oli*_*yes 5 r rcpp

可能是一个愚蠢的问题,但我已经寻找答案而无法找到答案:

我正在尝试编写一个文件阅读器,一个fread或者read.delim用C++实现,并通过Rcpp连接到R. 执行此操作并使其输出data.frame的最简单方法是生成一个List向量 - 每列一个 - 并将类设置为data.frame

List foo;
foo.push_back(column);
foo.attr("class") = "data.frame";
return foo;
Run Code Online (Sandbox Code Playgroud)

很简单,我以前做过.不幸:

  1. 我想要读入的文件可以有不同数量的字段;
  2. 如果您从列文件中读取文件,此模型只能优雅地工作,而实际文件往往是按行读取的.

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

List foo(1);
foo[0].push_back("turnip");
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法解决如何做到这一点:看起来List的成员向量不能被push_back(),因为这会导致错误"Rcpp :: Vector <19> :: Proxy没有成员命名推回()"

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

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

Dir*_*tel 5

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

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

Rblpapi(我贡献了一些其他代码)中,Whit尝试了一些方法并最终定义了他自己的辅助函数,我一直想要提炼/重构这个并与Kevin讨论 - 但这还没有发生.

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

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

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