我想创建一个在prevent_side_effects(expr, envir)
环境中执行expr
的函数envir
,但对envir
中的变量和函数具有只读权限,所有父环境。
锁定envir
并锁定其中的所有符号是实现此目的的唯一方法,还是有更好的方法?如果我去锁定路线,是否有必要走上父环境的图形并锁定它们?
以下是一个可重现的示例,演示了此函数的行为:
grandparent.env <- environment()
parent.env <- new.env(parent=grandparent.env)
env <- new.env(parent=parent.env)
env$x <- 1
parent.env$y <- 2
grandparent.env$z <- 3
grandparent.env$f <- function() cat('function defined in grandparent env\n')
out <- prevent_side_effects(envir=env, expr={
cat(sprintf('%i %i %i\n', x, y, z))
#> 1 2 3
f()
#> function defined in grandparent env
# The following all throw errors or just define new local variables such
# that variables in env, parent.env, and grandparent.env are masked but
# unchanged.
x <<- 1000
y <<- 1000
z <<- 1000
x <- 4
y <- 5
z <- 6
cat(sprintf('%i %i %i\n', x, y, z))
#> 4 5 6
})
cat(sprintf('%i %i %i\n', x, y, z))
#> 1 2 3