r - 使用基本 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 解决方案。
解决方案
我不认为你可以在 R 代码中做到这一点。实现的函数function
是从解析器调用的,其中
function(x = 3) { x }
被翻译成类似的东西
`function`( pairlist(as.name(x) = 3), quote({ x }))
但是上面的行在 R 中是不合法的:没有办法说列表元素上的标记应该是名称而不是字符值。您可以用 C 编写函数,或者坚持使用创建模板并一次替换部分模板的冗长解决方案。
推荐阅读
- python - sorted() 仅在第一次调用时失败
- python - 根据 URL 包含的最高参数过滤 URL 的 Python 列表
- python - 将 django 应用程序从 localhost 应用程序部署到 Web 应用程序
- laravel-5 - 为什么 DB::select 工作但 DB::table 不起作用?
- java - 为 servlet [dispatcherServlet] 提供错误 Servlet.service() 的自定义异常处理
- node.js - AWS Lambda 函数不会插入 Dynamo DB
- c - 为什么这个while条件没有捕捉到EOF?我得到分段错误
- php - 如何使用输入表单组合数组
- c++ - 如何将浮点算法转换为定点?
- php - 如何在 Yii2 项目中使用rectorphp/rector?