在 R 中,运行表达式会在全局环境中x <- 1
定义一个值为 的变量。在函数中执行相同操作会在函数的环境中定义变量。x
1
使用rlang::with_env
,我们也可以对任意环境做同样的事情:
e <- new.env()
rlang::with_env(e, {
x <- 1
y <- 2
f <- function(x) print(x)
g <- function() f(1)
})
e$x
#> [1] 1
e$g()
#> [1] 1
由reprex 包于 2021-10-26 创建(v2.0.1)
但是,我不知道如何在函数中做同样的事情。也就是说,一个函数接收表达式,然后在空白环境中运行它们,返回环境:
set_in_env <- function(expr) {
e <- new.env()
# q <- rlang::enquo(expr)
# z <- quote(expr)
# rlang::with_env(e, substitute(expr))
# rlang::with_env(e, parse(text = substitute(expr)))
# rlang::with_env(e, q)
# rlang::with_env(e, rlang::eval_tidy(q))
# rlang::with_env(e, z)
# rlang::with_env(e, eval(z))
rlang::with_env(e, expr)
rlang::with_env(e, {x <- 1})
return(e)
}
e <- set_in_env({y <- 2})
rlang::env_print(e)
#> <environment: 0000000014678340>
#> parent: <environment: 0000000014678730>
#> bindings:
#> * x: <dbl> <-- ONLY `x` WAS SET, NOT `y`!
也就是说,函数被赋予了y <- 2
应该在新环境中运行的表达式。出于演示目的,该函数还在x <- 1
环境中进行了内部设置。
无论我尝试过什么,环境都只是用创建的e$x
,从不定义e$y <- 2
(注释掉的代码是其他失败的尝试)。
我相信这是可以做到的,而且我只是错过了一些东西。那么,有人可以帮帮我吗?