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

TMS*_*TMS 268 r

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

我的尝试(不成功):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found
Run Code Online (Sandbox Code Playgroud)

谢谢!

Dir*_*tel 414

你想要exists():

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 
Run Code Online (Sandbox Code Playgroud)

  • @tim如果你在函数内部,则缺少()就是你想要的. (28认同)
  • 操作需要什么 - 使用变量名称,而不是引号? (4认同)
  • @Gavin&Dirk,你们真是太好了:)唯一的解决办法是,您将掷出硬币(伯努利,p = 0.5 :-)),该硬币将被接受!:-) (2认同)
  • 如果检查列表元素可能会有点棘手:http://stackoverflow.com/q/7719741 (2认同)

Rei*_*son 104

有关?exists"......已定义"的定义,请参阅.例如

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

  • @DirkEddelbuettel好吧,如果你将使用可笑的长对象名称;-) (8认同)
  • 你赢了52秒:) (7认同)
  • 嘿嘿.当我在发布之前测试出来的例子时,Gavin或Josh已经回答了这个问题. (2认同)

tim*_*tim 55

如果你在一个函数中,missing()就是你想要的.

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

exchequer()
x is missing… :-(
Run Code Online (Sandbox Code Playgroud)

  • 然而,`missing` 仅适用于函数参数。你不能做`foo &lt;- function(x) {missing(x); missing(y)}` 否则你会得到 `foo(1)` `&gt; Error in missing(y) : 'missing' 只能用于参数`。 (6认同)

San*_*ich 44

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

> exists("data")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题(正如Bazz所指出的那样;请参阅参考资料?exists)inherits:

> exists("data", inherits = FALSE)
[1] FALSE

foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

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

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

比较替换_object_name_"data.table"(TRUE)与"var"(FALSE)

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

  • 玩弄,使用参数“ inherits = FALSE”似乎可以隔离全局环境中的事物。听起来对吗? (2认同)
  • 由于我使用了变量名“ data”,因此此注释应该更高一些,刚开始使用存在就给我带来了麻烦。 (2认同)

Nir*_*mal 25

如果你不想使用引号,你可以使用我在"替换"的示例部分中找到的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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案可能有点复杂......但如果你不想与字符和变量名称抗衡,这是理想的答案 (2认同)

小智 6

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

存在(“x”)

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

存在(分离(替换(x)))