利用Rcpp在Cpp中应用R函数

时间:2017-06-26 04:45:55

标签: c++ r function rcpp

我的问题很简单:

我目前正试图通过使用Rcpp编写一些c ++代码来加速我的r代码。但是现在我需要自己插入一些我在R中编写的函数。我怎么能这样做?

Edit1:示例代码。

我自己写了三个函数,它们被称为:

1.pre_process。 2.transfer_element。 3.prediction。

#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代码中,我将使用&#34; dget&#34;函数调用存储函数,我不知道在c ++或Rcpp中这样做。

所有这三个函数都是用纯R代码编写的,并将它们转换成C ++就会杀了我。如果需要更多信息,请告诉我。

提前致谢,

彼得

1 个答案:

答案 0 :(得分:0)

C ++ 是与 R 不同的野兽。需要将 R 中的对象传输添加到 C ++ 中,事情会变得有点毛茸茸。

考虑:

$rcrds = \Searchy::search(...);

全局范围之外没有这些变量可以放在其中的范围。但是,缺乏正确的初始化是有问题的。特别是,考虑最初定义但未初始化的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使用情况。在这种特殊情况下,函数必须以这种方式命名,因为它是 R 的特权。所以,让我们调用您的函数int main()

此外,要在 R 中使用您的功能,您需要指定void hey_ya()

如上所述,您应该像这样构建代码:

// [[Rcpp::export]]

然而,因为你特别遗漏了一个完整的例子......这是一个玩具展示如何在Rcpp中使用#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. } } } }

dget