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