我想检查是否有变量在R中定义,而不会出错。我该怎么做呢?
我的尝试(不成功):
> is.na(ooxx) Error: object 'ooxx' not found > is.finite(ooxx) Error: object 'ooxx' not found
谢谢!
有关"…"的一些定义,请参阅?exists。定义”。如。
?exists
> exists("foo") [1] FALSE > foo <- 1:10 > exists("foo") [1] TRUE
你需要exists():
exists()
R> exists("somethingUnknown") [1] FALSE R> somethingUnknown <- 42 R> exists("somethingUnknown") [1] TRUE R>
如果你在一个函数中,missing()就是你想要的。
exchequer = function(x) { if(missing(x)){ message("x is missing… :-(") } } exchequer() x is missing… :-(
正如其他人指出的那样,你正在寻找exists。请记住,将exists与R的基本包使用的名称一起使用将返回true,无论是否定义了该变量:
exists
> exists("data") [1] TRUE
为了解决这个问题(正如Bazz指出的那样;参见?exists),使用inherits参数:
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)))
比较用"data.table" (TRUE)替换_object_name_ vs. "var" (FALSE)
"data.table"
TRUE
_object_name_
"var"
FALSE
(当然,如果你不在RStudio上,我认为第一个自动附加的环境是"package:stats")
"package:stats"
如果你不想使用引号,你可以使用deparse(substitute())技巧,这是我在?substitute的示例部分中发现的:
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
在某些情况下,您可能并不确切知道要查找的变量的名称,例如当队列系统创建了一个结果数组时。这些问题可以用“ls”及其参数“pattern”来解决,它需要一个正则表达式。
“exists”函数可以这样重新实现
exists <-function(variablename) { #print(ls(env=globalenv())) return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv()))) }
在准备这个答案时,我有点惊讶于从函数中调用ls ()时对环境规范的需求。所以,谢谢你,stackoverflow!还有一个“all.names”属性,我本应该将其设置为true,但我省略了它。
如果你不介意使用引号,你可以使用:
存在(“x")
如果你不想使用引号,你可以使用:
存在(deparse(替代(x)))