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

Make eval() use function environment rather than global 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()到return2

顺便说一句:我读了 Hadley 关于 environments and non-standard evaluation 的章节。

(原始问题)这将从 f 中提取 body-expression 并将其评估为 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

致反对者:解释为什么答案是 "not useful" 被认为是礼貌的。否则我们只能猜测是什么方面(正确性、可取性或???)可能触发了投票。

编辑后:这将提供所请求的结果,并且可能以一种不太可能冒犯那些遵守严格编码的人的方式 "morals":

 g = function() {a = 2; environment(h)$FUN(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"