首页 > 解决方案 > 使用基本 R 函数构造函数创建闭包

问题描述

使用基础 R,是否可以直接从其 3 个组件构造一个闭包?到目前为止,我所能做的只是稍微冗长

val <- 3L

fun_a <- function(x = 1L) val + x
fun_b <- function(x = 2L) val * x
fun_c <- function(){}

formals(fun_c) <- formals(fun_a)
body(fun_c) <- body(fun_b)
environment(fun_c) <- list2env(list(val = 5L))

fun_c()
#> [1] 5

此外,我似乎无法弄清楚如何调用function(). 我尝试过的一些事情:

`function`(formals(fun_a), body(fun_b))
#> Error: invalid formal argument list for "function"
`function`(as.pairlist(formals(fun_a)), body(fun_b))
#> Error: invalid formal argument list for "function"
do.call(`function`, c(formals(fun_a), body(fun_b)))
#> Error in do.call("function", c(formals(fun_a), body(fun_b))) :
#>  invalid formal argument list for "function"

我知道,rlang::new_function()但在这里我正在寻找基本的 R 解决方案。

标签: rfunctionconstructorclosures

解决方案


我不认为你可以在 R 代码中做到这一点。实现的函数function是从解析器调用的,其中

function(x = 3) { x }

被翻译成类似的东西

`function`( pairlist(as.name(x) = 3), quote({ x }))

但是上面的行在 R 中是不合法的:没有办法说列表元素上的标记应该是名称而不是字符值。您可以用 C 编写函数,或者坚持使用创建模板并一次替换部分模板的冗长解决方案。


推荐阅读