使用 Rcpp 在 Cpp 中应用 R 函数

Applied R Function in Cpp with 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 代码中,我将使用 "dget" 函数来调用存储函数,我不知道在 C++ 或 Rcpp 中这样做。

这三个函数都是用纯 R 代码编写的,将它们转移到 C++ 中会要了我的命。如果需要更多信息,请告诉我。

提前致谢,

彼得

C++R 不同。添加需要 transfer 一个对象从 RC++ 并且事情会变得有点毛茸茸。


考虑:

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;

global 范围之外没有任何范围可以容纳这些变量。但是,缺乏正确的初始化是有问题的。特别是考虑初始定义但未初始化的 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;
}