可能是一个愚蠢的问题,但我已经寻找答案而无法找到答案:
我正在尝试编写一个文件阅读器,一个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)
很简单,我以前做过.不幸:
所以,答案是能够定义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",并咬掉由于必须迭代[列数]次而不是一次而导致的性能成本?
希望这个问题足够清楚.很高兴回答任何问题.
如果事先既不知道行也不知道列,这是一个半难的问题.
在几年前的一个工作,保持关闭的项目中,我收集了我的数据作为变体类型(使用相应的Boost类)并在最后转换.
在Rblpapi(我贡献了一些其他代码)中,Whit尝试了一些方法并最终定义了他自己的辅助函数,我一直想要提炼/重构这个并与Kevin讨论 - 但这还没有发生.
所以随时想出更好的东西:)
一般来说,回到你的问题,我们经常通过回拨逐行接收数据.当你按元素追加元素时,Rcpp类型(包装R类型)做得非常差 - 所以不要做天真,push_back因为你最终会复制很多.
因此,如果你知道你的类型,那就做std::list对应std::vector<T>的T.你可以成长这些载体.一旦你拥有它们,组装一个Rcpp::List,因此Rcpp::DataFrame更容易.