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

Passing dataset from R to C++ (using .Call)

本文关键字:C++ 使用 呼叫 数据集      更新时间:2023-10-16

我需要加快 R 到 C++ 中的数据处理速度。我已经有了我的C++代码,它基本上从 txt 文件中读取 R 应该传递的内容。由于我需要 R 进行分析,因此我想将我的C++代码集成到 R 中。

C++代码需要的是一个(大(数据帧(我使用 std::vector<std::vector>>(和一组参数,所以我正在考虑通过 .调用接口,然后按以下方式处理数据:

  • R:使用给定编码将数据写入 txt 文件

  • C++:从 txt 读取,做我需要做的事情并将结果写入 txt(它仍然是一个数据集 -> std::vector(

  • R:从 txt 读取结果

这将避免我重写部分代码。可能的问题/瓶颈在于阅读/写作,您认为这是一个真正的问题吗?

否则,作为替代方案,通过 C++结构复制我的所有数据是否合理。呼叫接口?

谢谢。

您可以从 RcppExample 包中非常简单的数据帧示例开始:

#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的特征和犰狳。 等等 - CRAN上有超过1350个软件包,你可以学习。 Rcpp 画廊中提供了大量现成的示例。

来回读取和写入大型数据集不是在 R 和C++代码之间传递数据的最佳解决方案。根据C++代码执行的时间长短,这可能是也可能不是代码中最严重的瓶颈,但应避免使用此方法。

您可以查看以下解决方案来传递 data.frame(或 data.table(对象: 使用"Rcpp"和/或"RcppArmadillo"将"data.table"传递给c ++函数

至于传递其他参数,解决方案将取决于我们正在谈论的参数类型。如果这些只是数值,则可以将它们直接传递给C++(请参阅Rcpp 的高性能函数:http://adv-r.had.co.nz/Rcpp.html(。