将数据集从R传递到C ++(使用.Call)

时间:2018-05-04 09:46:09

标签: c++ r

我需要加速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 ++结构中的所有数据是否合理?

谢谢。

2 个答案:

答案 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还有大量准备好的例子。