Respuestas:
Tu quieres exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Ver ?exists
, para alguna definición de "... se define". P.ej
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
si está dentro de una función, falta () es lo que desea.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
Sin embargo, solo funciona para argumentos de función. No puedes hacer foo <- function(x) {missing(x); missing(y)}
o obtendrás foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Como otros han señalado, estás buscando exists
. Tenga en cuenta que usar exists
con los nombres utilizados por los paquetes base de R devolvería verdadero independientemente de si definió la variable:
> exists("data")
[1] TRUE
Para evitar esto (como señaló Bazz; ver ?exists
), use el inherits
argumento:
> exists("data", inherits = FALSE)
[1] FALSE
foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE
Por supuesto, si desea buscar los espacios de nombres de los paquetes adjuntos, esto también se quedaría corto:
> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE
Lo único en lo que puedo pensar para evitar esto, para buscar en paquetes adjuntos pero no en paquetes básicos, es lo siguiente:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
Comparar reemplazo _object_name_
con "data.table"
( TRUE
) vs. "var"
( FALSE
)
(por supuesto, si no estás en RStudio, creo que el primer entorno conectado automáticamente es "package:stats"
)
inherits = FALSE
parece aislar las cosas en el entorno global. ¿Eso suena bien?
Si no desea usar comillas, puede usar el deparse(substitute())
truco que encontré en la sección de ejemplos de ?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
o evaluarlo en la función como esta:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Puede haber situaciones en las que no sepa exactamente el nombre de la variable que está buscando, como cuando un sistema de colas ha creado una matriz de resultados. Posiblemente se puedan abordar con "ls" y su argumento "patrón" que espera una expresión regular.
La función "existe" podría reimplementarse de esa manera
exists <-function(variablename) {
#print(ls(env=globalenv()))
return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}
Mientras preparaba esta respuesta, me sorprendió un poco la necesidad de la especificación del entorno al invocar ls () desde una función. Entonces, gracias por eso, stackoverflow! También hay un atributo "all.names" que debería haber establecido en verdadero pero que he omitido.