336 votes

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

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

Mes tentatives (infructueuses) :

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

Gracias.

509voto

Dirk Eddelbuettel Points 134700

Vous voulez exists() :

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

3 votes

@Gavin & Dirk, vous êtes si gentils l'un envers l'autre :) La seule solution est de tirer à pile ou face (Bernoulli avec p=0.5 :-)) qui obtiendra l'acceptation ! :-)

35 votes

@tim si vous êtes à l'intérieur d'une fonction, missing() est ce que vous voulez.

2 votes

La vérification des éléments d'une liste peut s'avérer un peu plus délicate : stackoverflow.com/q/7719741

125voto

Gavin Simpson Points 72349

Véase ?exists pour une certaine définition de "...est défini". Par exemple

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

11 votes

@DirkEddelbuettel Eh bien, si vous utilisez des noms d'objets ridiculement longs ;-)

3 votes

Heh. Cela m'arrive tout le temps lorsque je teste des exemples avant de les poster et que Gavin ou Josh y ont déjà répondu.

68voto

tim Points 543

Si vous êtes à l'intérieur d'une fonction, missing() est ce que vous voulez.

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

exchequer()
x is missing… :-(

6 votes

missing ne fonctionne toutefois que pour les arguments de fonctions. 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 .

61voto

Santiago Baldrich Points 713

Comme d'autres l'ont souligné, vous recherchez exists . Gardez à l'esprit que l'utilisation de exists avec des noms utilisés par les paquets de base de R renverrait un résultat vrai, que vous ayez ou non défini la variable :

> exists("data")
[1] TRUE

Pour contourner ce problème (comme l'a fait remarquer Bazz ; voir ?exists ), utiliser la fonction inherits argument :

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

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

Bien entendu, si vous souhaitiez effectuer une recherche dans les espaces de noms des paquets attachés, cette solution ne serait pas non plus satisfaisante :

> 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 ce problème est de rechercher dans les paquets joints mais no 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_ con "data.table" ( TRUE ) vs. "var" ( FALSE )

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

38voto

Nirmal Points 366

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X