r - 根据在外部函数中确定的值执行内部函数
问题描述
我们正在尝试让所有用户编写一个函数,该函数将根据运行时可用的变量来执行(这是一个模拟上下文)。
用户使用“函数声明器”“声明”一个内部函数。稍后,当调用外部函数时,所需的信息(我的 var)就可用了。但是我们只是不知道如何将它赋予声明的变量。
如果可能的话,我们想使用 rlang / tidyverse 风格的工具来解决这个问题。提前致谢。
library(rlang)
function_declarer <- function(expr) {
function() {
eval(expr)
}
}
inner_function <- function_declarer(mean(my_var))
outer_function <- function(step) {
my_var <- c(5, 6, 7)
# environment(step) <- env_clone(environment(step), parent = current_env()) # know this does not work
step()
}
outer_function(inner_function)
解决方案
看来您只能获取未评估的表达式,然后稍后使用eval
本地环境对其进行评估。
library(rlang)
function_declarer <- function(expr) {
enexpr(expr)
}
inner_function <- function_declarer(mean(my_var))
outer_function <- function(step) {
my_var <- c(5, 6, 7)
eval(step)
}
outer_function(inner_function)
所以在这个场景中,我们使用的是表达式而不是函数。函数会增加复杂性,因为变量是词法范围的,因此在定义函数的环境中查找自由变量,而不是在调用它的位置。使用表达式可以避免这个问题。所以你可以简化这个
inner_function <- quote(mean(my_var)) # base
inner_function <- rlang::expr(mean(my_var)) # rlang