Me gustaría verificar si alguna variable está definida en R, sin obtener un error. ¿Cómo puedo hacer esto?
Mis intentos (no exitosos):
> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found
¡Gracias!
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.ejfuente
si está dentro de una función, falta () es lo que desea.
fuente
missing
Sin embargo, solo funciona para argumentos de función. No puedes hacerfoo <- function(x) {missing(x); missing(y)}
o obtendrásfoo(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 usarexists
con los nombres utilizados por los paquetes base de R devolvería verdadero independientemente de si definió la variable:Para evitar esto (como señaló Bazz; ver
?exists
), use elinherits
argumento:Por supuesto, si desea buscar los espacios de nombres de los paquetes adjuntos, esto también se quedaría corto:
Lo único en lo que puedo pensar para evitar esto, para buscar en paquetes adjuntos pero no en paquetes básicos, es lo siguiente:
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"
)fuente
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
:fuente
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
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.
fuente