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!
Vous voulez exists()
:
R> exists("somethingUnknown")
[1] FALSE
R> somethingUnknown <- 42
R> exists("somethingUnknown")
[1] TRUE
R>
Voir ?exists
, pour une définition de "... est défini". Par exemple.
> exists("foo")
[1] FALSE
> foo <- 1:10
> exists("foo")
[1] TRUE
si vous êtes dans une fonction, il vous manque ().
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
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"
)
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
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.