繁体   English   中英

使用Rcpp在Cpp中应用R函数

[英]Applied R Function in Cpp with Rcpp

我的问题很简单:

我目前正在尝试通过使用Rcpp编写一些c ++代码来加速我的r代码。 但是现在我需要插入一些我自己用R语言编写的函数。 我该怎么办?

编辑1:示例代码。

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

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是不同的野兽。 加上对象从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.
            }
        }
    }
}

不过,既然你主要是省掉了一个完整的例子......这里有一个如何一起工作玩具显示dget在RCPP。

#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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM