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

时间:2016-11-21 21:42:27

标签: 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

顺便说一句:我在environmentsnon-standard evaluation上阅读了Hadley的章节。

1 个答案:

答案 0 :(得分:0)

(原始问题)这将从func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) 中提取正文表达式并将其评估为f的本地表达式:

g

也可以试试这个:

 f = function(x) {eval(parse(text = x))}
 g = function() {a = 2; eval( body(f), envir = list(x="a"))}

> g()
[1] 2

对于downvoter:解释为什么答案“无用”被认为是礼貌的。否则我们会猜测可能引发投票的方面(正确性,可取性或???)。

编辑之后:现在这将提供所要求的结果,并且可能以不太可能具有攻击性的方式对那些坚持严格编码“道德”的人:

>  g = function() {a = 2; eval(call("f", a))}
> g()
[1] 2

可以提取Vectorized-function中项目的名称和类:

 g = function() {a = 2; environment(h)$FUN(a)}
 g()
#[1] 2