2015-04-06 207 views
1

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

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

所以有一个非常基本的方法是调用的r功能“整合”不亚于需要:

// [[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'在范围中不可用。任何帮助表示赞赏。

+1

见http://stackoverflow.com/questions/28379015/how-to-calculate-integral-numerically-in-rcpp/28380986?noredirect=1#comment45136452_28380986了类似的问题。 – utobi 2015-04-06 12:57:06

回答

2

如果你愿意通过调用硬编码到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]; 
} 

我在同一个定义inte源文件为intecxx,以确保它在全球环境中可用,因此可从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 
+1

这是一流的。荣誉。 – 2015-04-06 19:49:21