Je voudrais vérifier si une variable est définie dans R - sans obtenir d'erreur. Comment puis-je faire ceci?
Mes tentatives (infructueuses):
> 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 exemplela source
si vous êtes à l'intérieur d'une fonction, manquant () est ce que vous voulez.
la source
missing
ne fonctionne que pour les arguments de fonction, cependant. Vous ne pouvez pas fairefoo <- function(x) {missing(x); missing(y)}
ou vous obtiendrezfoo(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'utilisationexists
avec des noms utilisés par les packages de base de R retournerait vrai, que vous ayez défini ou non la variable:Pour contourner cela (comme l'a souligné Bazz; voir
?exists
), utilisez l'inherits
argument:Bien sûr, si vous vouliez rechercher les espaces de noms des packages attachés, cela serait également insuffisant:
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:
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"
)la source
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
:la source
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
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.
la source