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


294

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

我的尝试(未成功):

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

谢谢!

Answers:


448

您要exists()

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

3
@Gavin&Dirk,你们真是太好了:)唯一的解决办法是,您将掷出硬币(伯努利,p = 0.5 :-)),该硬币将被接受!:-)
TMS

29
@tim(如果您位于函数内部),那么所需的是missing()。
CousinCocaine 2014年

2
如果检查列表元素,可能会变得有些棘手:stackoverflow.com/q/7719741
TMS

5
op想要什么-使用变量名,而不用引号呢?
2015年

109

有关?exists“ ...已定义”的某些定义,请参见。例如

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

7
您以52秒的时间获胜:)
德克·埃德布特尔

9
@DirkEddelbuettel好吧,如果您使用荒谬的长对象名;-)
Gavin Simpson

2
呵呵。当我在发布之前测试示例时,总是发生在我身上,Gavin或Josh已经回答了。
Maiasaura

60

如果您在函数内部,则缺少所需的missing()。

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

exchequer()
x is missing… :-(

missing但是,仅适用于函数参数。你做不到foo <- function(x) {missing(x); missing(y)}否则你会得到的foo(1) > Error in missing(y) : 'missing' can only be used for arguments
丹妮德

45

正如其他人指出的那样,您正在寻找exists。请记住,exists与R的基本包使用的名称一起使用将返回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"


2
玩耍,使用参数inherits = FALSE似乎在全球环境中隔离事物。听起来对吗?
CJB

1
@Bazz你是正确的;我已将其编辑为答案。
MichaelChirico

2
由于我使用的是变量名“ data”,因此此注释应该更高一些,刚开始使用存在就给我带来了一些麻烦。
mzm

25

如果您不想使用引号,则可以使用deparse(substitute())我在以下示例部分中找到的技巧?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

1
您也可以force使用以下函数或对其进行评估:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
chinsoon12

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,但应该省略。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.