rcpp函数构造一个函数
Rcpp function to construct a function
在 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 中有一个如此复杂的创建函数,它接受几个参数,设置 returned 函数中使用的一些常量,进行一些中间计算等......但结果是功能太慢了。因此,我尝试将代码翻译成 C++,以便与 Rcpp 一起使用。但是,我想不出一种在 C++ 函数中构造函数的方法,并且 return 它可以在 R 中使用。
这是我目前拥有的:
Rcpp::Function createax2Rcpp(int a) {
double ax2(double x) {
return(a * pow(x, 2));
};
return (ax2);
}
这给了我错误 'function definition is not allowed here',我不知道如何创建函数。
编辑:问题 RcppArmadillo pass user-defined function 很接近,但据我所知,它只提供了一种将 C++ 函数传递给 R 的方法。它没有提供初始化某些值的方法传递给 R 之前的 C++ 函数。
好的,据我了解,您想要一个函数返回带有闭包的函数,a.k.a。 " 闭包中定义的函数 'remembers' 创建它的环境。"
在 C++11 及更高版本中,很可能定义这样的函数,如下所示
std::function<double(double)> createax2Rcpp(int a) {
auto ax2 = [a](double x) { return(double(a) * pow(x, 2)); };
return ax2;
}
会发生什么,匿名 class 和重载对象 operator()
将被创建,它将捕获闭包并移出创建者函数。 Return 将被捕获到具有类型擦除等 std::function 的实例中
但是! C/C++ R 中的函数要求是某种类型,即 narrower(与 [=25= 相反]wider,您可以将 narrow 对象捕获到 wide 对象中,但反之则不行)。
因此,我不知道如何从 std::function 中创建一个合适的 R 函数,看起来这是不可能的。
也许,像下面这样模拟闭包可能会有所帮助
static int __a;
double ax2(double x) {
return(__a * pow(x, 2));
}
Rcpp::Function createax2Rcpp(int a) {
__a = a;
return (ax2);
}
在 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 中有一个如此复杂的创建函数,它接受几个参数,设置 returned 函数中使用的一些常量,进行一些中间计算等......但结果是功能太慢了。因此,我尝试将代码翻译成 C++,以便与 Rcpp 一起使用。但是,我想不出一种在 C++ 函数中构造函数的方法,并且 return 它可以在 R 中使用。
这是我目前拥有的:
Rcpp::Function createax2Rcpp(int a) {
double ax2(double x) {
return(a * pow(x, 2));
};
return (ax2);
}
这给了我错误 'function definition is not allowed here',我不知道如何创建函数。
编辑:问题 RcppArmadillo pass user-defined function 很接近,但据我所知,它只提供了一种将 C++ 函数传递给 R 的方法。它没有提供初始化某些值的方法传递给 R 之前的 C++ 函数。
好的,据我了解,您想要一个函数返回带有闭包的函数,a.k.a。 " 闭包中定义的函数 'remembers' 创建它的环境。"
在 C++11 及更高版本中,很可能定义这样的函数,如下所示
std::function<double(double)> createax2Rcpp(int a) {
auto ax2 = [a](double x) { return(double(a) * pow(x, 2)); };
return ax2;
}
会发生什么,匿名 class 和重载对象 operator()
将被创建,它将捕获闭包并移出创建者函数。 Return 将被捕获到具有类型擦除等 std::function 的实例中
但是! C/C++ R 中的函数要求是某种类型,即 narrower(与 [=25= 相反]wider,您可以将 narrow 对象捕获到 wide 对象中,但反之则不行)。
因此,我不知道如何从 std::function 中创建一个合适的 R 函数,看起来这是不可能的。
也许,像下面这样模拟闭包可能会有所帮助
static int __a;
double ax2(double x) {
return(__a * pow(x, 2));
}
Rcpp::Function createax2Rcpp(int a) {
__a = a;
return (ax2);
}