我遇到了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'找不到
修改
在现实世界中,f
和g
是用户定义的,所以我应该按原样保留这些功能的主体。
答案 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