【问题标题】:Checking for existence of a variable检查变量是否存在
【发布时间】:2014-09-08 03:37:17
【问题描述】:

我真的很难理解 R 的以下行为。假设我们要定义一个函数f,它应该返回其参数是否作为变量存在;但我们想传递不带引号的参数。因此,例如要检查变量y 是否存在,我们将调用f(y)

f <- function(x) {
    xchar <- deparse(substitute(x))
    exists(xchar)
}

所以我开始一个全新的 R 会话并定义 f,但没有其他变量。然后我得到 ​​p>

f(y)
# [1] FALSE
f(z)
# [1] FALSE
f(f)
# [1] TRUE
f(x)
# [1] TRUE

前三个调用(yzf)给出了预期的结果。但是没有名为x的变量

exists("x")
# [1] FALSE

编辑我现在意识到这是因为使用了substitute,它将创建变量x。但是有没有办法解决这个问题?

【问题讨论】:

    标签: r


    【解决方案1】:

    对象x 确实存在于函数内部,因为它是参数的名称。

    如果修改函数

    f <- function(...) {
          xchar <- deparse(substitute(...))
          exists(xchar)
         }
    

    你可以看到预期的输出:

    f(x)
    # FALSE
    

    【讨论】:

    • 是的,谢谢:) 我刚问完这个问题就意识到了这一点。有办法解决吗?
    【解决方案2】:

    您可能只想搜索全局环境

    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
    

    【讨论】:

    • 是的,这是避免错误的另一种方法,但我想搜索所有环境。
    猜你喜欢
    • 2016-12-28
    • 2013-11-13
    • 2014-06-23
    • 2017-08-05
    • 2010-10-25
    • 2011-12-16
    • 2017-02-13
    • 2011-12-19
    相关资源
    最近更新 更多