簡體   English   中英

將數據集從 R 傳遞到 C++(使用 .Call)

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

我需要通過 C++ 加速 R 中的數據處理。 我已經有了我的 C++ 代碼,它基本上從 txt 文件中讀取 R 應該通過的內容。 由於我需要 R 進行分析,因此我想將我的 C++ 代碼集成到 R 中。

C++ 代碼需要的是一個(大)數據幀(我使用 std::vector<std::vector> >)和一組參數,所以我正在考慮通過 .Call 接口傳遞參數,然后處理數據通過以下方式:

  • R:用給定的編碼在txt文件中寫入數據

  • C++:從txt讀取,做我需要做的事情並將結果寫入txt(仍然是數據集-> std::vector)

  • R:從txt讀取結果

這將避免我重寫部分代碼。 可能的問題/瓶頸在於閱讀/寫作,您認為這是一個真正的問題嗎?

否則,作為替代方案,通過 .Call 接口將所有數據復制到 C++ 結構中是否合理?

謝謝你。

您可以從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 中有大量可立即運行的示例。

來回讀取和寫入大型數據集並不是在 R 和 C++ 代碼之間傳遞數據的最佳解決方案。 根據您的 C++ 代碼執行多長時間,這可能是也可能不是代碼中最嚴重的瓶頸,但應該避免這種方法。

您可以查看以下解決方案以傳遞 data.frame(或 data.table)對象: 使用 `Rcpp` 和/或 `RcppArmadillo` 將 `data.table` 傳遞給 C++ 函數

至於傳遞額外的參數,解決方案將取決於我們所談論的參數類型。 如果這些只是數值,那么您可以將它們直接傳遞給 C++(請參閱Rcpp 的高性能函數http : //adv-r.had.co.nz/Rcpp.html )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM