133 votes

Comment tester si l'élément de liste existe?

Problème

Je voudrais tester si un élément d'une liste existe, voici un exemple

foo <- list(a=1)
exists('foo') 
TRUE   #foo does exist
exists('foo$a') 
FALSE  #suggests that foo$a does not exist
foo$a
[1] 1  #but it does exist

Dans cet exemple, je sais qu' foo$a existe, mais le test renvoie FALSE.

J'ai regardé en ?exists et ont constaté qu' with(foo, exists('a') retours TRUE, mais ne comprennent pas pourquoi exists('foo$a') retours FALSE.

Questions

  • Pourquoi est - exists('foo$a') rendement FALSE?
  • L'utilisation d' with(...) l'approche privilégiée?

181voto

Tommy Points 16323

C'est effectivement un peu plus compliqué que vous ne le pensez. Depuis une liste peut en fait (avec un peu d'effort) contiennent des éléments NULL, il pourrait ne pas être suffisante pour vérifier l' is.null(foo$a). Un critère plus exigeant, peut-être pour vérifier que le nom est en fait défini dans la liste:

foo <- list(a=42, b=NULL)
foo

is.null(foo[["a"]]) # FALSE
is.null(foo[["b"]]) # TRUE, but the element "exists"...
is.null(foo[["c"]]) # TRUE

"a" %in% names(foo) # TRUE
"b" %in% names(foo) # TRUE
"c" %in% names(foo) # FALSE

...et foo[["a"]] est plus sûr que d' foo$a, puisque ce dernier utilise la reconnaissance partielle et pourraient également correspondre à un nom plus long:

x <- list(abc=4)
x$a  # 4, since it partially matches abc
x[["a"]] # NULL, no match

[Mise à JOUR] Donc, revenons à la question "pourquoi" exists('foo$a') ne fonctionne pas. L' exists fonction vérifie si une variable existe dans un environnement, pas si des parties d'un objet existe. La chaîne "foo$a" est interprété littéraire: Est-il une variable qui s'appelle "toto$a"? ...et la réponse est - FALSE...

foo <- list(a=42, b=NULL) # variable "foo" with element "a"
"bar$a" <- 42   # A variable actually called "bar$a"...
ls() # will include "foo" and "bar$a" 
exists("foo$a") # FALSE 
exists("bar$a") # TRUE

54voto

Jim Points 386

La meilleure façon de vérifier les éléments nommés est d'utiliser exist() , mais les réponses ci-dessus n'utilisent pas la fonction correctement. Vous devez utiliser l'argument where à exister pour rechercher la variable dans la liste.

 foo <- list(a=42, b=NULL)

exists('a', where=foo) #TRUE
exists('b', where=foo) #TRUE
exists('c', where=foo) #FALSE
 

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