我试图在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);
}
有谁知道为什么这不起作用?
答案 0 :(得分:6)
您的代码存在一些问题。
std
与C++ Standard Library namespace有关
错误:将'std'重新定义为不同类型的符号
R::
是一个处理Rmath functions的命名空间。其他R
函数将在此范围内找到 。Rcpp::Environment
中给出的Rcpp::Function
和sd_r_cpp_call()
。
说到这里,让我们谈谈代码:
#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)
*/