R - Evaluate a nested function in an environment

懵懂的女人 提交于 2019-11-30 20:01:32

There are a number of ways of doing this, but I kind of like this one:

jobenv <- new.env(parent=globalenv())

local({
    f1 <- function(x) x*2
    f2 <- function(y) f1(y) + 1
}, envir=jobenv)

## Check that it works
ls(jobenv)
# [1] "f1" "f2"
local(f2(3), envir=jobenv)
# [1] 7
eval(quote(f2(3)), envir=jobenv)
# [1] 7

Scope is defined when the function is created, not when it's called. See section 10.7 of the Introduction to R manual.

This seems a bit odd to me, but you get the same behavior even if you avoid assign all together and just use $<-.

jobenv <- new.env(parent=globalenv())
jobenv$f1 <- function(x) x*2
jobenv$f2 <- function(y) f1(y) + 1
expr <- quote(f2(3))
eval(expr, envir=jobenv)

This seems to be because the enclosing environment of f1 and f2 is the global environment. I would have expected it to be jobenv.

> environment(jobenv$f1)
<environment: R_GlobalEnv>
> environment(jobenv$f2)
<environment: R_GlobalEnv>

One solution is to explicitly set the environment of each function... but there has to be an easier way.

> environment(jobenv$f1) <- jobenv
> environment(jobenv$f2) <- jobenv
> eval(expr, envir=jobenv)
[1] 7
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!