在Rcpp中调用R函数

时间:2016-06-24 15:20:52

标签: r rcpp

我试图在Rcpp中调用sd(x),这是一个R函数。我已经看到了在Rcpp中调用R函数dbate(x)的例子,它运行得很好。

// dens calls the pdf of beta distribution in R
//[[Rcpp::export]]
double dens(double x, double a, double b)
{
    return R::dbeta(x,a,b,false);
}

但是当我厌倦了将此方法应用于sd(x)时,它出错了。

// std calls the sd function in R
//[[Rcpp::export]]
double std(NumericVector x)
{
  return R::sd(x);
}

有谁知道为什么这不起作用?

1 个答案:

答案 0 :(得分:6)

您的代码存在一些问题。

  1. stdC++ Standard Library namespace有关
    • 这是触发:
        

      错误:将'std'重新定义为不同类型的符号

  2. R::是一个处理Rmath functions的命名空间。其他R函数将在此范围内找到
  3. 要从C ++中直接调用R函数,必须使用示例Rcpp::Environment中给出的Rcpp::Functionsd_r_cpp_call()
    • 这种方法存在许多问题,但包括但不限于速度损失。
  4. 理想的做法是使用Rcpp sugar表达式或实现自己的方法。
  5. 说到这里,让我们谈谈代码:

    #include <Rcpp.h>
    
    //' @title Accessing R's sd function from Rcpp
    // [[Rcpp::export]]
    double sd_r_cpp_call(const Rcpp::NumericVector& x){
    
      // Obtain environment containing function
      Rcpp::Environment base("package:stats"); 
    
      // Make function callable from C++
      Rcpp::Function sd_r = base["sd"];    
    
      // Call the function and receive its list output
      Rcpp::NumericVector res = sd_r(Rcpp::_["x"] = x,
                                     Rcpp::_["na.rm"]  = true); // example of additional param
    
      // Return test object in list structure
      return res[0];
    }
    
    
    // std calls the sd function in R
    //[[Rcpp::export]]
    double sd_sugar(const Rcpp::NumericVector& x){
      return Rcpp::sd(x); // uses Rcpp sugar
    }
    
    /***R
    x = 1:5
    r = sd(x)
    v1 = sd_r_cpp_call(x)
    v2 = sd_sugar(x)
    
    all.equal(r,v1)
    all.equal(r,v2)
    */