eval中的词法作用域和嵌套函数(parse())

时间:2017-04-28 16:31:08

标签: r closures eval lexical-scope

我遇到了drake issue 35的问题,我已经为此SO帖子复制了最小版本的错误。简而言之,我希望eval(parse())能够使用嵌套函数,非平凡闭包和自定义环境。如果以下eval(parse(text = "f(1:10)"), envir = e)返回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)
  

(函数(x)中的错误:找不到函数" g"

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

匹配错误(x,table,nomatch = 0L):         object' vectorize.args'找不到

修改

在现实世界中,fg是用户定义的,所以我应该按原样保留这些功能的主体。

2 个答案:

答案 0 :(得分:2)

使用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()

答案 1 :(得分:0)

对于后人,我只想为不依赖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