5

我觉得好像这是一个相当基本的问题,但我无法弄清楚。

如果我在 R 中定义了一个函数,我以后如何使用函数的名称来获取它的解析树。我不能只使用substitute它,因为它只会返回其参数的解析树,在这种情况下只是函数名。

例如,

> f <- function(x){ x^2 }
> substitute(f)
f

我应该如何使用函数的名称访问函数的解析树?例如,如果substitute(function(x){ x^2 })不明确写出整个函数,我将如何获得 的值?

4

3 回答 3

5

我不确定其中哪些符合您的需求:

 eval(f)
#function(x){ x^2 }

 identical(eval(f), get("f"))
#[1] TRUE
 identical(eval(f), substitute( function(x){ x^2 })  )
#[1] FALSE

 deparse(f)
#[1] "function (x) " "{"             "    x^2"       "}"            

 body(f)
#------
{
    x^2
}
#---------

eval(parse(text=deparse(f)))
#---------
function (x) 
{
    x^2
}
#-----------

 parse(text=deparse(f))
#--------
expression(function (x) 
{
    x^2
})
#--------

 get("f")
# function(x){ x^2 }

打印表示可能不会显示返回值的全部特征。

 class(substitute(function(x){ x^2 }) )
#[1] "call"
 class( eval(f) ) 
#[1] "function"
于 2013-06-11T21:56:25.640 回答
3

该函数substitute可以替换绑定到环境的值。奇怪的是它的env参数没有默认值,但它默认为评估环境。当评估环境是全局环境时,此行为似乎使其失败,但在其他情况下工作正常。

这是一个例子:

> a = new.env()
> a$f = function(x){x^2}
> substitute(f, a)
function(x){x^2}
> f = function(x){x^2}
> environment()
<environment: R_GlobalEnv>
> substitute(f, environment())
f
> substitute(f, globalenv())
f

如图所示,当使用全局环境作为第二个参数时,功能失败。

进一步演示它可以正常使用a但不能使用全局环境:

> evalq(substitute(f), a)
function(x){x^2}
> evalq(substitute(f), environment())
f

相当令人费解。

于 2013-06-20T19:24:10.697 回答
3

显然,这确实是一些奇怪的怪癖,并且在这里substitute提到:

/* do_substitute 有两个参数,一个表达式和一个环境(可选)。在表达式中找到的符号将替换为其在环境中找到的值。没有继承,因此只搜索提供的环境。如果未指定环境,则使用调用替代的环境。 如果指定的环境是 R_GlobalEnv,由于历史原因,它会转换为 R_NilValue。在substitute() 中,R_NilValue 表示不应进行替换,只提取promise 表达式。不应评估 do_substitute 的参数。*/

而且您已经找到了一种绕过它的方法:

e = new.env()
e$fn = f
substitute(fn, e)
于 2013-06-20T20:40:08.767 回答