当内部有嵌套函数时,如何在 R 中以编程方式创建函数?

How to create a function programatically in R when there is a nested function inside?

我的目标是使用代码创建以下函数:

s <- c(x = 10)
a <- c(i = 3)

model <- function(s, a) {
  with(as.list(c(s, a)), {
    y <- x * i
    y * 10
  })
}

model(s, a)

结果应该是 300。

我正在解析另一个软件,我可以从该软件中提取方程式作为字符串。所以,我需要从这些字符串构造函数的主体。

我一直在尝试使用 rlang 库,但无济于事。

library(rlang)

func_body <- "with(as.list(c(s, a)), {
  y <- x * i
  y * 10
})";

foo <- new_function(
  exprs(s =, a = ),
  expr(!!parse(text = func_body))
)

有什么想法吗?

不确定您在这里使用 new_function 的动机,但这给出了您的预期输出:

library(rlang)

s <- (x = 10)
a <- (i = 3)

foo <- new_function(
  args = pairlist2(s =, a =),
  body = expr(
    with(as.list(c(s, a)), {
      y <- x * i
      y * 10
    })
  )
)

foo(s, a)
#[1] 300

如果正文是字符串使用 parse_expr:

foo2 <- new_function(
  args = pairlist2(s =, a =),
  body = parse_expr(
    "with(as.list(c(s, a)), {
      y <- x * i
      y * 10
    })"
  )
)

foo2(s, a)
#[1] 300

使用 base R 你可以做到:

foo <- function(s, a){}
body(foo) <- parse(text=func_body)
foo(s, a)
#> [1] 300

另一种方法,仍然在基础 R 中是:

foo <- as.function(c(alist(s=,a=), parse(text=func_body)[[1]]))
foo(s, a)
#> [1] 300

作为旁注,在您的示例中根本没有使用 sa 的值,您只是使用全局工作区中的 x 和 i 的值。你可能想要:

# cleanup
rm(s,a,x,i)
s <- c(x = 10)
a <- c(i = 3)
foo(s, a)
#> [1] 300