首页 文章

如何检查R中是否定义了对象(变量)?

提问于
浏览
214

我想检查是否在R中定义了一些变量 - 没有出错 . 我怎样才能做到这一点?

我的尝试(不成功):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

谢谢!

5 回答

  • 355

    你想 exists()

    R> exists("somethingUnknown")
    [1] FALSE
    R> somethingUnknown <- 42
    R> exists("somethingUnknown")
    [1] TRUE
    R>
    
  • 14

    有关"...is defined"的某些定义,请参阅 ?exists . 例如 .

    > exists("foo")
    [1] FALSE
    > foo <- 1:10
    > exists("foo")
    [1] TRUE
    
  • 37

    如果你在函数内部,则缺少()就是你想要的 .

    exchequer = function(x) {
        if(missing(x)){
            message("x is missing… :-(")
        }
    }
    
    exchequer()
    x is missing… :-(
    
  • 93

    正如其他人所指出的那样,你正在寻找 exists . 请记住,无论是否定义了变量,使用带有R基本包使用的名称的 exists 都将返回true:

    > exists("data")
    [1] TRUE
    

    要解决这个问题(正如Bazz所指出的那样;请参阅 ?exists ),请使用 inherits 参数:

    > exists("data", inherits = FALSE)
    [1] FALSE
    
    foo <- TRUE
    > exists("foo", inherits = FALSE)
    [1] TRUE
    

    当然,如果你想搜索附加包的名称空间,这也可能不足:

    > exists("data.table")
    [1] FALSE
    require(data.table)
    > exists("data.table", inherits = FALSE)
    [1] FALSE
    > exists("data.table")
    [1] TRUE
    

    我唯一能想到的解决方法是 - 在附加包中搜索而不是在基础包中搜索 - 如下:

    any(sapply(1:(which(search() == "tools:rstudio") - 1L),
               function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
    

    _object_name_"data.table"TRUE )与 "var"FALSE )进行比较

    (当然,如果你不在RStudio上,我认为第一个自动附加的环境是 "package:stats"

  • 50

    如果您不想使用引号,可以使用我在“替换”的示例部分中找到的deparse(substitute())技巧:

    is.defined <- function(sym) {
      sym <- deparse(substitute(sym))
      env <- parent.frame()
      exists(sym, env)
    }
    
    is.defined(a)
    # FALSE
    a <- 10
    is.defined(a)
    # TRUE
    

相关问题