R 使eval()使用函数环境而不是全局环境
编辑:我未能共享与我的用例更相关的MWE 我在使R 使eval()使用函数环境而不是全局环境,r,expression,environment,R,Expression,Environment,编辑:我未能共享与我的用例更相关的MWE 我在使eval()使用正确的环境时遇到问题 > f = function(x) {eval.parent(parse(text = x))} > h = Vectorize(f, "x") > g = function() {a = 2; h("a")} > a = 1 > h("a") a 1 > g() a 1 上面,我希望g()返回2 顺便说一句:我读了哈德利关于和的章节。(原始问题)这将从f中提取身体表达式,
eval()
使用正确的环境时遇到问题
> f = function(x) {eval.parent(parse(text = x))}
> h = Vectorize(f, "x")
> g = function() {a = 2; h("a")}
> a = 1
> h("a")
a
1
> g()
a
1
上面,我希望g()
返回2
顺便说一句:我读了哈德利关于和的章节。(原始问题)这将从f
中提取身体表达式,并对其进行局部求值g
:
f = function(x) {eval(parse(text = x))}
g = function() {a = 2; eval( body(f), envir = list(x="a"))}
> g()
[1] 2
也可以尝试以下方法:
> g = function() {a = 2; eval(call("f", a))}
> g()
[1] 2
对下层选民:解释为什么答案“没有用”被认为是礼貌的。否则,我们只能猜测是什么因素(正确性、可取性或???)触发了投票
编辑后:这将提供所要求的结果,并且可能以一种不太可能冒犯那些坚持严格编码“道德”的人的方式:
可以提取向量化函数中项目的名称和类:
> ls.str(environment(h))
arg.names : chr "x"
collisions : logi FALSE
FUN : function (x)
FUNV : function (x)
SIMPLIFY : logi TRUE
USE.NAMES : logi TRUE
vectorize.args : chr "x"
这是由于R中的词法范围规则。请使用
eval.parent()
而不是eval()
。看看这个答案<在函数外部定义的code>a是1
所以要从g()
函数更改它,您需要:g=function(){a@Abdou我不想修改全局环境。变量a
在调用g()
后应该保持等于1
。您真正想做什么?或者使用eval(解析(text=x),env=sys.frames()[[1]])
如果你的目标环境总是紧跟在全局环境之后,那么这个答案是没有用的,因为它没有回答这个问题。OP显然是在尝试对f
进行更改,这将导致g
返回他们想要的内容。相反,修改g
是不相关的。我认为OP的意思是f
是不可侵犯的?这不是我读问题标题的方式,也不是OP试图将eval
更改为eval.parent
以使其生效的事实。谢谢你的解释。也许我们的评论交换会促使OP做出澄清,并回答HongDoi的问题。我会取消我的投票。这应该会起作用,尽管我我现在采取了不同的策略。
> ls.str(environment(h))
arg.names : chr "x"
collisions : logi FALSE
FUN : function (x)
FUNV : function (x)
SIMPLIFY : logi TRUE
USE.NAMES : logi TRUE
vectorize.args : chr "x"