首页 > 解决方案 > 根据在外部函数中确定的值执行内部函数

问题描述

我们正在尝试让所有用户编写一个函数,该函数将根据运行时可用的变量来执行(这是一个模拟上下文)。

用户使用“函数声明器”“声明”一个内部函数。稍后,当调用外部函数时,所需的信息(我的 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)

标签: rrlang

解决方案


看来您只能获取未评估的表达式,然后稍后使用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

推荐阅读