web-dev-qa-db-fra.com

Comment vérifier si objet (variable) est défini dans R?

J'aimerais vérifier si une variable est définie dans R - sans erreur. Comment puis-je faire ceci?

Mes tentatives (non réussies):

> is.na(ooxx)
Error: object 'ooxx' not found
> is.finite(ooxx)
Error: object 'ooxx' not found

Merci!

254
TMS

Vous voulez exists():

R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R> 
401
Dirk Eddelbuettel

Voir ?exists, pour une définition de "... est défini". Par exemple.

> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
101
Gavin Simpson

si vous êtes dans une fonction, il vous manque ().

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

exchequer()
x is missing… :-(
55
tim

Comme d'autres l'ont fait remarquer, vous recherchez exists. N'oubliez pas que l'utilisation de exists avec les noms utilisés par les paquetages de base de R renverrait true, que vous ayez ou non défini la variable:

> exists("data")
[1] TRUE

Pour résoudre ce problème (comme l'a souligné Bazz; voir ?exists), utilisez l'argument inherits:

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

foo <- TRUE
> exists("foo", inherits = FALSE)
[1] TRUE

Bien sûr, si vous vouliez rechercher les espaces de noms des paquets attachés, cela serait également insuffisant:

> exists("data.table")
[1] FALSE
require(data.table)
> exists("data.table", inherits = FALSE)
[1] FALSE
> exists("data.table")
[1] TRUE

La seule chose à laquelle je peux penser pour contourner cela - chercher dans les paquets attachés mais pas dans les paquets de base - est la suivante:

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

Comparez en remplaçant _object_name_ par "data.table" (TRUE) par rapport à "var" (FALSE)

(Bien sûr, si vous n'êtes pas sur RStudio, je pense que le premier environnement automatiquement connecté est "package:stats")

42
Santiago Baldrich

Si vous ne voulez pas utiliser de guillemets, vous pouvez utiliser le truc deparse (substitute ()) que j'ai trouvé dans la section exemple 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
22
Nirmal

Il peut arriver que vous ne connaissiez pas exactement le nom de la variable que vous recherchez, par exemple lorsqu'un tableau de résultats a été créé par un système de mise en file d'attente. Ceux-ci peuvent éventuellement être adressés avec "ls" et son argument "pattern" qui attend une expression régulière.

La fonction "existe" pourrait être réimplémentée de la sorte

exists <-function(variablename) {
   #print(ls(env=globalenv()))
   return(1==length(ls(pattern=paste("^",variablename,"$",sep=""),env=globalenv())))
}

Lors de la préparation de cette réponse, j'ai été un peu surpris de la nécessité de spécifier l'environnement lors de l'appel de ls () depuis une fonction. Alors, merci pour ça, stackoverflow! Il y a aussi un attribut "all.names" que j'aurais dû mettre à true mais que j'ai omis.

0
smoe