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

eval(parse()中的词法作用域和嵌套函数,r,closures,eval,lexical-scope,R,Closures,Eval,Lexical Scope,我有麻烦,我已经复制了一个最低版本的错误,为这篇文章。简单地说,我希望eval(parse())使用嵌套函数、非平凡闭包和自定义环境。如果 EVE(解析(text = f(1:10)),EnvIR=E)下面返回“代码> 211 11/代码>,没有错误或警告,我将考虑解决这个问题。 e = new.env(parent = globalenv()) e$f = Vectorize(function(x) g(x), "x") e$g = function(x) x + 1 eval(parse(t

我有麻烦,我已经复制了一个最低版本的错误,为这篇文章。简单地说,我希望
eval(parse())
使用嵌套函数、非平凡闭包和自定义环境。如果<代码> EVE(解析(text = f(1:10)),EnvIR=E)<代码>下面返回“代码> 211 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”

匹配错误(x,表格,nomatch=0L): 找不到对象“vectorize.args”

编辑


在现实世界中,
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(父级=globalenv())

评估(解析)(text='f我真的希望我能这样做,但在现实世界中,
f
g
是用户定义的。这是
drake
试图完成的任务中不可避免的一部分。没关系,我没有完全阐述问题的限制。对OP的编辑应该会有所帮助。我只是提到
drake
,因为人们没有这样做将批评使用
eval(parse())
的前提。这看起来更有希望,但我仍然在g(x)中遇到
错误:找不到函数“g”
。我在Red Hat Linux 4.4.7-16和Windows 7上尝试了你的想法R 3.3.3和3.4.0。这是奇怪的部分。我每次都从一个新的工作区开始。甚至没有自动加载的
.RData
文件。
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()
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)