可能是一个愚蠢的问题,但是我一直在寻找答案并找不到答案:
我尝试编写文件阅读器,la fread
或read.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没有名为push_back()的成员"
所以,我的问题是:有没有办法在Rcpp列表中附加一个向量?或者是我唯一的选择,逐列读取文件,将生成的向量追加到" foo",并且不得不迭代它所产生的性能成本[列数]而不是一次?
希望这个问题很清楚。很高兴回答任何问题。
答案 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}}就更容易了。