我需要加速R到C ++的数据处理。我已经有了我的C ++代码,它基本上从txt文件读取R应该传递的内容。由于我需要R进行分析,因此我希望将我的C ++代码集成到R。
中C ++代码需要的是(大)数据帧(我使用std :: vector< std :: vector>>)和一组参数,所以我在考虑通过.Call接口传递参数然后以下列方式处理数据:
R:使用给定的编码在txt文件中写入数据
C ++:从txt读取,做我需要做的事情并将结果写入txt(仍然是数据集 - > std :: vector)
R:从txt
这可以避免我重写部分代码。可能的问题/瓶颈在于读/写,您认为这是一个真正的问题吗?
否则,作为替代方案,通过.Call接口复制C ++结构中的所有数据是否合理?
谢谢。
答案 0 :(得分:0)
来回读取和写入大数据集不是在R和C ++代码之间传递数据的最佳解决方案。根据您的C ++代码执行的时间长短,这可能是或者可能不是代码中最严重的瓶颈,但应该避免这种方法。
您可以查看以下解决方案以传递data.frame(或data.table)对象: Passing a `data.table` to c++ functions using `Rcpp` and/or `RcppArmadillo`
至于传递附加参数,解决方案将取决于我们所讨论的参数类型。如果这些只是数值,那么您可以将它们直接传递给C ++(参见使用Rcpp的高性能函数:http://adv-r.had.co.nz/Rcpp.html)。
答案 1 :(得分:0)
您可以从RcppExamples包中的非常简单的DataFrame示例开始:
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
List DataFrameExample(const DataFrame & DF) {
// access each column by name
IntegerVector a = DF["a"];
CharacterVector b = DF["b"];
DateVector c = DF["c"];
// do something
a[2] = 42;
b[1] = "foo";
c[0] = c[0] + 7; // move up a week
// create a new data frame
DataFrame NDF = DataFrame::create(Named("a")=a,
Named("b")=b,
Named("c")=c);
// and return old and new in list
return List::create(Named("origDataFrame") = DF,
Named("newDataFrame") = NDF);
}
您可以分配矢量(来自Rcpp或STL)和矩阵(再次,来自Rcpp,或者如果您更喜欢嵌套的STL向量)。然后你还有通过RcppEigen和RcppArmadillo的Eigen和Armadillo。而且 - 在CRAN上你可以学习超过1350个软件包。 Rcpp Gallery还有大量准备好的例子。