Réponses:
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 à l'intérieur d'une fonction, manquant () est ce que vous voulez.
exchequer = function(x) {
if(missing(x)){
message("x is missing… :-(")
}
}
exchequer()
x is missing… :-(
missing
ne fonctionne que pour les arguments de fonction, cependant. Vous ne pouvez pas faire foo <- function(x) {missing(x); missing(y)}
ou vous obtiendrez foo(1)
> Error in missing(y) : 'missing' can only be used for arguments
.
Comme d'autres l'ont souligné, vous recherchez exists
. Gardez à l'esprit que l'utilisation exists
avec des noms utilisés par les packages de base de R retournerait vrai, que vous ayez défini ou non la variable:
> exists("data")
[1] TRUE
Pour contourner cela (comme l'a souligné Bazz; voir ?exists
), utilisez l' inherits
argument:
> 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 packages 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 - pour rechercher dans les packages joints mais pas dans les packages de base - est la suivante:
any(sapply(1:(which(search() == "tools:rstudio") - 1L),
function(pp) exists(_object_name_, where = pp, inherits = FALSE)))
Comparer le remplacement _object_name_
par "data.table"
( TRUE
) vs "var"
( FALSE
)
(bien sûr, si vous n'êtes pas sur RStudio, je pense que le premier environnement attaché automatiquement est "package:stats"
)
inherits = FALSE
semble isoler les choses dans l'environnement mondial. Est-ce que ça sonne bien?
Si vous ne voulez pas utiliser de guillemets, vous pouvez utiliser l' deparse(substitute())
astuce que j'ai trouvée 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
force
ou l'évaluer dans la fonction comme ceci:is.defined <- function(sym) class(try(sym, TRUE))!='try-error'
Il peut y avoir des situations dans lesquelles vous ne connaissez pas exactement le nom de la variable que vous recherchez, comme lorsqu'un tableau de résultats a été créé par un système de mise en file d'attente. Ceux-ci peuvent éventuellement être traités avec "ls" et son argument "pattern" qui attend une expression régulière.
La fonction "existe" pourrait être réimplémentée de cette façon
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 la spécification de l'environnement lors de l'appel de ls () à partir d'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.