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
编辑
在现实世界中,f
和 g
是用户定义的,所以我应该保持这些函数的主体不变。
使用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
我在使用 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
编辑
在现实世界中,f
和 g
是用户定义的,所以我应该保持这些函数的主体不变。
使用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