R 使eval()使用函数环境而不是全局环境

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中提取身体表达式,

编辑:我未能共享与我的用例更相关的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
中提取身体表达式,并对其进行局部求值
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"