我觉得好像这是一个相当基本的问题,但我无法弄清楚。
如果我在 R 中定义了一个函数,我以后如何使用函数的名称来获取它的解析树。我不能只使用substitute
它,因为它只会返回其参数的解析树,在这种情况下只是函数名。
例如,
> f <- function(x){ x^2 }
> substitute(f)
f
我应该如何使用函数的名称访问函数的解析树?例如,如果substitute(function(x){ x^2 })
不明确写出整个函数,我将如何获得 的值?
我觉得好像这是一个相当基本的问题,但我无法弄清楚。
如果我在 R 中定义了一个函数,我以后如何使用函数的名称来获取它的解析树。我不能只使用substitute
它,因为它只会返回其参数的解析树,在这种情况下只是函数名。
例如,
> f <- function(x){ x^2 }
> substitute(f)
f
我应该如何使用函数的名称访问函数的解析树?例如,如果substitute(function(x){ x^2 })
不明确写出整个函数,我将如何获得 的值?
我不确定其中哪些符合您的需求:
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"
该函数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
相当令人费解。
显然,这确实是一些奇怪的怪癖,并且在这里substitute
提到:
/* do_substitute 有两个参数,一个表达式和一个环境(可选)。在表达式中找到的符号将替换为其在环境中找到的值。没有继承,因此只搜索提供的环境。如果未指定环境,则使用调用替代的环境。 如果指定的环境是 R_GlobalEnv,由于历史原因,它会转换为 R_NilValue。在substitute() 中,R_NilValue 表示不应进行替换,只提取promise 表达式。不应评估 do_substitute 的参数。*/
而且您已经找到了一种绕过它的方法:
e = new.env()
e$fn = f
substitute(fn, e)