从 Rcpp 调用 R 函数

Calling R function from Rcpp

我有一个关于通过 Rcpp 在 R 中集成 C++ 的非常基本的问题。假设我想在 C++ 中实现一个像这样的简单函数:

inte = function(x, y, a, b){
   model = approxfun(x, y)
   return(integrate(model, a, b)$value)
}

所以一个非常基本的方法是根据需要调用 R 的函数 'integrate':

// [[Rcpp::export]]
double intecxx(Function inte, NumericVector x, NumericVector y,
  double a, double b) {  
    NumericVector res;
    res = inte(x, y, a, b);
    return res[0];
}

但是,我需要在我的 C++ 代码的许多其他部分使用此 'intecxx',因此从其他地方调用它会导致 'inte' 在范围内不可用。感谢任何帮助。

如果您愿意通过在正文中硬编码对 inte 的调用来修改 intecxx,而不是尝试将其作为参数传递,您可以使用以下方法:

#include <Rcpp.h>

/*** R
inte = function(x, y, a, b){
   model = approxfun(x, y)
   return(integrate(model, a, b)$value)
}

.x <- 1:10
set.seed(123)
.y <- rnorm(10)
*/

// [[Rcpp::export]]
double intecxx(Rcpp::NumericVector x, Rcpp::NumericVector y, double a, double b) {  
    Rcpp::NumericVector res;
    Rcpp::Environment G = Rcpp::Environment::global_env();
    Rcpp::Function inte = G["inte"];
    res = inte(x, y, a, b);
    return res[0];
}

我在与 intecxx 相同的源文件中定义了 inte 以确保它在全局环境中可用,因此可以从 intecxxG 中调用.

R> inte(.x, .y, 1, 10)
[1] 1.249325

R> intecxx(.x, .y, 1, 10)
[1] 1.249325

R> all.equal(inte(.x, .y, 1, 10),intecxx(.x, .y, 1, 10))
[1] TRUE