从 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
以确保它在全局环境中可用,因此可以从 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
我有一个关于通过 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
以确保它在全局环境中可用,因此可以从 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