在R中,存在创建另一个函数的函数的可能性,例如
create_ax2 <- function(a) {
ax2 <- function(x) {
y <- a * x^2
return(y)
}
return(ax2)
}
结果是
> fun <- create_ax2(3)
> fun(1)
[1] 3
> fun(2)
[1] 12
> fun(2.5)
[1] 18.75
我在R中有这么复杂的创建函数,它接受几个参数,设置返回函数中使用的一些常量,做一些中间计算等等......但结果是一个太慢的函数。因此我尝试将代码转换为C ++以将其与Rcpp一起使用。但是,我无法找到在C ++函数中构造函数并将其返回以在R中使用的方法。
这是我到目前为止所做的:
Rcpp::Function createax2Rcpp(int a) {
double ax2(double x) {
return(a * pow(x, 2));
};
return (ax2);
}
这给了我错误&#39;这里不允许使用函数定义&#39;,我对如何创建函数感到困惑。
编辑:问题RcppArmadillo pass user-defined function接近,但据我所知,它只提供了一种将C ++函数传递给R的方法。它没有提供一种在C ++函数中初始化某些值的方法在它传递给R之前。
答案 0 :(得分:1)
好的,据我所知,你想要一个带闭包的函数返回函数,a.k.a。&#34;封闭中定义的函数记得&#39;它创建的环境。&#34;
在C ++ 11及更高版本中,很有可能沿着
行定义这样的功能std::function<double(double)> createax2Rcpp(int a) {
auto ax2 = [a](double x) { return(double(a) * pow(x, 2)); };
return ax2;
}
会发生什么,将创建具有重载operator()
的匿名类和对象,它将捕获闭包并移出创建者函数。返回将被捕获到具有类型擦除等的std :: function的实例中。
但是! R 中的C / C ++函数需要属于某种类型,更窄(与更宽相反,您可以捕获将对象缩小为宽一个,但反之则不然。)
因此,我不知道如何从std :: function中使用正确的 R 函数,看起来不可能。
也许,如下所示的闭包仿真可能会有所帮助
static int __a;
double ax2(double x) {
return(__a * pow(x, 2));
}
Rcpp::Function createax2Rcpp(int a) {
__a = a;
return (ax2);
}