Answers:
您要exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
有关?exists
“ ...已定义”的某些定义,请参见。例如
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
正如其他人指出的那样,您正在寻找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"
)
inherits = FALSE
似乎在全球环境中隔离事物。听起来对吗?
如果您不想使用引号,则可以使用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
force
使用以下函数或对其进行评估:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
在某些情况下,您可能不完全知道要查找的变量的名称,例如排队系统已经创建了一系列结果。可以使用“ ls”及其期望正则表达式的参数“ pattern”解决这些问题。
“存在”功能可以通过以下方式重新实现:
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
在准备此答案时,我对从函数内调用ls()时对环境规范的需求感到惊讶。所以,谢谢你,stackoverflow!我还应该将“ all.names”属性设置为true,但应该省略。