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