eval(parse()) 中的词法范围和嵌套函数

lexical scoping and nested functions in eval(parse())

我在使用 drake issue 35 时遇到了问题,我已经为这个 SO post 重现了一个最小版本的错误。简而言之,我希望 eval(parse()) 使用嵌套函数、非平凡闭包和自定义环境。如果 eval(parse(text = "f(1:10)"), envir = e) 低于 returns 2:11 并且没有错误或警告,我将认为问题已解决。

e = new.env(parent = globalenv())
e$f = Vectorize(function(x) g(x), "x")
e$g = function(x) x + 1
eval(parse(text = "f(1:10)"), envir = e)

Error in (function (x) : could not find function "g"

environment(e$f) = environment(e$g) = e
eval(parse(text = "f(1:10)"), envir = e)

Error in match(x, table, nomatch = 0L) : object 'vectorize.args' not found

编辑

在现实世界中,fg 是用户定义的,所以我应该保持这些函数的主体不变。

使用attach附加e环境的对象并调用函数f.

e = new.env(parent = globalenv())
e$f = Vectorize(function(x) g(x), "x")
e$g = function(x) x + 1
attach(e)
search()
eval(parse(text='f(1:10)'))
# [1]  2  3  4  5  6  7  8  9 10 11
detach(e)
search()

为了后代,我只想为同一个想法添加另一种不依赖于 attach() 的方法。

e = new.env(parent = globalenv())
eval(parse(text='f <- Vectorize(function(x) g(x), "x")'), envir = e)
eval(parse(text='g <- function(x) x + 1'), envir = e)
e2 = list2env(as.list(e), parent = e)
eval(parse(text = "f(1:10)"), envir = e2)

[1] 2 3 4 5 6 7 8 9 10 11