2015-04-06 3 views
1

У меня есть очень простой вопрос о интеграции C++ в R через Rcpp. Предположим, я хочу, чтобы реализовать простую функцию, как этот в C++:Вызов функции R из Rcpp

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]; 
} 

Тем не менее, я нужно использовать этот «intecxx» во многих других частях моего кода на C++, поэтому вызов его из другого места приводит к тому, что «inte» недоступен в области. Любая помощь приветствуется.

+1

См http://stackoverflow.com/questions/28379015/how-to-calculate-integral-numerically-in-rcpp/28380986?noredirect=1#comment45136452_28380986 по аналогичному вопросу. – utobi

ответ

2

Если вы готовы изменить intecxx по жестко прописывать вызов inte внутри тела, а не пытаться передать его в качестве параметра, вы могли бы использовать этот подход:

#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, чтобы обеспечить его доступность в глобальной среде и, следовательно, вызываемый из intecxx через G.

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

Это превосходно. Престижность. –