Ах, я думаю, что получил это сейчас.
Это связано со структурой формальных аргументов функции:
Если аргумент определен без значения по умолчанию, R будет жаловаться, когда вы вызываете функцию, не указывая, что она технически может найти его в своей области видимости.
Один из способов запустить лексическую область видимости, даже если вы не хотите определять значение по умолчанию, - это установить значения по умолчанию "на лету" во время выполнения с помощью rlang::fn_fmls()
.
foo <- function(fun) {
env_enclosing <- rlang::fn_env(fun)
env_enclosing$x <- 5
fun()
}
# No argument at all -> lexical scoping takes over
baz <- function() x
foo(baz)
#> [1] 5
# Set defaults to desired values on the fly at run time of `foo()`
foo <- function(fun) {
env_enclosing <- rlang::fn_env(fun)
env_enclosing$x <- 5
fmls <- rlang::fn_fmls(fun)
fmls$x <- substitute(get("x", envir = env_enclosing, inherits = FALSE))
rlang::fn_fmls(fun) <- fmls
fun()
}
bar <- function(x) x
foo(bar)
#> [1] 5