我真的很难理解R的以下行为。假设我们想要定义一个函数f
,它应该返回它的参数是否作为变量存在;但是我们想要在没有引号的情况下传递参数。因此,例如,要检查变量y
是否存在,我们将调用f(y)
。
f <- function(x) {
xchar <- deparse(substitute(x))
exists(xchar)
}
所以我开始一个全新的R会话并定义f
,但没有其他变量。然后我得到
f(y)
# [1] FALSE
f(z)
# [1] FALSE
f(f)
# [1] TRUE
f(x)
# [1] TRUE
前三个电话(y
,z
,f
)会给出预期结果。但是没有名为x
exists("x")
# [1] FALSE
编辑我现在意识到这是因为使用了substitute
,它将创建变量x
。但有没有办法绕过这个?
答案 0 :(得分:2)
对象x
确实存在于函数内部,因为它是参数的名称。
如果修改功能
f <- function(...) {
xchar <- deparse(substitute(...))
exists(xchar)
}
你可以看到预期的输出:
f(x)
# FALSE
答案 1 :(得分:0)
您可能只想搜索全球环境
f <- function(x) {
xchar <- deparse(substitute(x))
exists(xchar,where=globalenv())
}
在这种情况下你得到:
> f(y)
[1] FALSE
> f(f)
[1] TRUE
> f(x)
[1] FALSE
> f(z)
[1] FALSE
> f(mean)
[1] TRUE