2015-04-06 111 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