防止R表达的副作用

时间:2015-10-23 14:11:54

标签: r metaprogramming side-effects

我想创建一个在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

0 个答案:

没有答案