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

时间:2012-02-20 21:46:48

标签: r

我想检查R中是否定义了某个变量而没有出错。我怎么能这样做?

我的尝试(未成功):

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

谢谢!

7 个答案:

答案 0 :(得分:389)

您想要exists()

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

答案 1 :(得分:99)

请参阅?exists,了解“.​​.....已定义”的定义。 E.g。

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

答案 2 :(得分:54)

如果你在一个函数中,则缺少()就是你想要的。

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

exchequer()
x is missing… :-(

答案 3 :(得分:40)

正如其他人所指出的那样,您正在寻找exists。请记住,无论您是否定义了变量,将exists与R&lt; base}使用的名称一起使用都将返回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"

答案 4 :(得分:20)

如果您不想使用引号,可以使用我在“替换”的示例部分中找到的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

答案 5 :(得分:1)

在某些情况下,您可能不完全知道要查找的变量的名称,例如排队系统已经创建了一系列结果。可以使用“ ls”及其参数“ pattern”处理正则表达式来解决这些问题。

可以通过以下方式重新实现“存在”功能

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

在准备这个答案的同时,我对从函数内部调用ls()时对环境规范的需求感到惊讶。所以,谢谢你,stackoverflow!还有一个“ all.names”属性,我应该设置为true,但省略了。

答案 6 :(得分:0)

如果您不介意使用引号,可以使用:

<块引用>

存在("x")

如果您不想使用引号,可以使用:

<块引用>

exists(deparse(substitute(x)))