使用 R,如何将字符串转换为函数(例如,使用 `as.function`)?

Using R, how to cast a character string as a function (e.g., using `as.function`)?

我有一个字符串:

FUN.n = "exp( 3 * x^2 + 2 * x + 1)";

我想把它转换成一个函数:

myFunction = castAsFunction ( FUN.n );

这样我就可以访问它了:

myFunction(x)

它会进行适当的评估。

FUN.n = "exp( 3 * x^2 + 2 * x + 1)";
myFunction = castAsFunction (  FUN.n );

# [...]
myFunction = function(x)
    {
    exp( 3 * x^2 + 2 * x + 1);
    }

x = -3:3;

myFunction(x);

# [1] 3.6e+09 8.1e+03 7.4e+00 2.7e+00 4.0e+02 2.4e+07 5.8e+14

我已经尝试了 as.functioneval(parse(text 以及 none 它们的行为符合我的预期。

我正在寻找可变参数解决方案。

我们实际上可以创建一个名为 castAsFunction 的函数。我们不仅需要给它一个字符串作为函数体,还需要给它形式参数。感觉功能可以再精简一下,但是用上面的例子就可以了

FUN.n = "exp( 3 * x^2 + 2 * x + 1)"
x = -3:3

castAsFunction <- function(body, ...) {
  dots <- match.call(expand.dots = FALSE)$... 
  form_ls <- rep(list(bquote()), length(dots))
  names(form_ls) <- as.character(dots)
  f <- function(){}
  formals(f) <- form_ls
  body(f) <- str2lang(body)
  environment(f) <- parent.frame()
  f
}

myfun <- castAsFunction(FUN.n, x)

myfun
#> function (x) 
#> exp(3 * x^2 + 2 * x + 1)

myfun(x)
#> [1] 3.584913e+09 8.103084e+03 7.389056e+00 2.718282e+00 4.034288e+02
#> [6] 2.415495e+07 5.834617e+14

reprex package (v0.3.0)

于 2021 年 2 月 18 日创建