【问题标题】:Call R functions in Rcpp [duplicate]在 Rcpp 中调用 R 函数 [重复]
【发布时间】:2016-06-24 15:20:51
【问题描述】:

我试图在 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);
}

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

【问题讨论】:

  • 你能提供错误信息吗?
  • 是的!它有几个错误信息: 将“std”重新定义为另一种符号;命名空间“R”中没有名为“sd”的成员;你是说简单的'sd'吗?意外的命名空间“std”:预期的表达式
  • 无论如何,这种方法应该可行 --> stackoverflow.com/questions/36594628/…
  • 谢谢!看来我可以学习另一种方法来完成这项工作!

标签: r rcpp


【解决方案1】:

您的代码存在一些问题。

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

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

  2. R:: 是处理Rmath functions 的命名空间。其他 R 函数将不会在此范围内找到。
  3. 要在 C++ 中直接调用 R 函数,您必须使用 Rcpp::EnvironmentRcpp::Function,如示例 sd_r_cpp_call() 中所示。
    • 这种方法存在许多问题,包括但不限于速度损失。
  4. 最好使用Rcpp sugar 表达式或实现您自己的方法。

说到这里,我们来谈谈代码:

#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)
*/

【讨论】:

  • 不应该是return R::sd(x); // uses Rcpp sugar吗?
  • 没有。此函数是 Rcpp 糖的一部分,而不是 Rmath 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
相关资源
最近更新 更多