Rcpp函数构造函数

时间:2016-01-25 14:01:46

标签: r function rcpp return-type

在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之前。

1 个答案:

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