2017-06-26 129 views
0

我的問題很簡單:應用R函數在Cpp與Rcpp

我目前正試圖通過使用Rcpp來編寫一些C++代碼來加速我的r代碼。但是現在我需要插入一些我自己寫在R中的函數。我怎麼能這樣做?

編輯1:示例代碼。

我有三個功能我寫我自己,他們被稱爲:

1.pre_process。 2.transfer_element。 3.預測。

#include <Rcpp.h> 
using namespace Rcpp; 

NumericVector sel_p; 
NumericVector pur_p; 
int k = sel_p.length(); 
int bps = 20; 
NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
float profit = sum(sel_p) + sum(pur_p_temp); 
NumericVector minute_data; 
NumericMatrix dataset; 

int main(){ 
    while(TRUE){ 
    //GET MINUTE DATA HERE. 
    if (minute_data == dataset.end()) { 
     std::cout << "repeating" << std::endl; 
    } else if(minute_data != dataset.end()) { 
     dataset.push_back(minute_data) 
     std::cout << "Working!No Worries." << std::endl; 
     if (dataset.nrow() > bps) { 
     //transfer_element here. 
     //pre_process here. 
     //prediction here. 
     } 
     } 
    } 
    } 
} 

在R代碼裏面,我會用「DGET」功能調用存儲功能,我沒有這樣做,在C++或RCPP想法。

所有這三個函數都寫在純R代碼中,並將它們轉換成C++會殺了我。如果需要更多信息,請告訴我。

由於提前,

彼得

+0

請分享您的C++和R代碼的示例,以及您正在嘗試使用的代碼。如果它有很多代碼,請舉一個小例子。 – SymbolixAU

+0

當然,謝謝你的建議。 – PetaGlz

+0

結帳RInside http://dirk.eddelbuettel.com/code/rinside.html –

回答

0

C++是一個不同的野獸比- [R。加入需要轉移一個對象從R轉換成C++和東西可以有點毛。


考慮:

NumericVector sel_p; 
NumericVector pur_p; 
int k = sel_p.length(); 
int bps = 20; 
NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
float profit = sum(sel_p) + sum(pur_p_temp); 
NumericVector minute_data; 
NumericMatrix dataset; 

還有就是全球範圍之外沒有範圍,這些變量可以休息。然而,由於缺乏正確的初始化是有問題的。特別是,考慮初始定義但未初始化的pur_p變量。然後這個變量在稍後被操作以創建pur_p_temp


接下來,我們簡單談談int main()的用法。在這種特殊情況下,功能必須以而不是這樣命名,因爲這是R的特權。所以,讓我們打電話給你的功能void hey_ya()

此外,內使用函數R,你需要指定// [[Rcpp::export]]


通過以上雖這麼說,你應該構建像這樣的代碼:

#include <Rcpp.h> 

// [[Rcpp::export]] 
void hey_ya(Rcpp::NumericVector sel_p, Rcpp::NumericVector pur_p, 
      Rcpp::NumericVector minute_data, Rcpp::NumericMatrix dataset){ 

    int k = sel_p.length(); 
    int bps = 20; 
    Rcpp::NumericVector pur_p_temp(pur_p.begin(), sel_p.end()); 
    float profit = sum(sel_p) + sum(pur_p_temp); 

    while(TRUE){ 
     // GET MINUTE DATA HERE. 
     if (minute_data == dataset.end()) { 
      Rcpp::Rcout << "repeating" << std::endl; 
     } else if(minute_data != dataset.end()) { 
      dataset.push_back(minute_data) 
      Rcpp::Rcout << "Working! No Worries." << std::endl; 
      if (dataset.nrow() > bps) { 
       //transfer_element here. 
       //pre_process here. 
       //prediction here. 
      } 
     } 
    } 
} 

但是,由於您特別忽略了一個完整的示例...以下是玩具展示如何在Rcpp中使用dget

#include <Rcpp.h> 

// [[Rcpp::export]] 
Rcpp::NumericVector dget_example(std::string file) { 
    // Obtain environment containing function 
    Rcpp::Environment base("package:base"); 

    // Make function callable from C++ 
    Rcpp::Function dget_r = base["dget"]; 

    // Call the function and receive its list output 
    Rcpp::NumericVector res = dget_r(Rcpp::Named("file") = file); 
    // Change the above data type depending on _X_ object. 

    return res; 
} 
+0

感謝您的耐心和完整的答覆,我真的很感激。我仍然是C++的初學者,所以如果我問了一些非常愚蠢的問題,請原諒我。那麼我應該如何改變我的數據類型呢?喜歡,這取決於我的輸出或輸入? – PetaGlz

+0

取決於用'dget'讀取的'file'中的內容。在這種情況下,我認爲它是'Numeric'類型。 – coatless

+0

我想讀取一個名爲trans.R的R文件,是你如何判斷類型?它完全寫在R代碼中,我會嘗試數字。 – PetaGlz