46 votes

Quelle est la différence entre NULL et character(0) dans R ?

Quelle est la différence entre NULL et character(0) | integer(0) etc ?

> identical(NULL, character(0))
[1] FALSE

> is.null(integer(0))
[1] FALSE

> str(character(0))
 chr(0) 

> str(NULL)
 NULL

En général, il semble que vous pouvez passer NULL en tant que paramètres dans les fonctions, et qu'un vecteur vide est généralement renvoyé en tant que character(0) , integer(0) etc.

Pourquoi est-ce le cas ? En y réfléchissant, existe-t-il un test pour le zéro, a la is.integer0 ?

39voto

Gavin Simpson Points 72349

El Définition du langage R n a ceci sur NULL :

Il existe un objet spécial appelé NULL. Il est utilisé à chaque fois qu'il est nécessaire d'indiquer ou de spécifier qu'un objet est absent. Il ne doit pas être confondu avec un vecteur ou une liste de longueur nulle. longueur nulle. L'objet NULL n'a pas de type ni de propriétés modifiables. Il n'y a qu'un seul objet NULL dans R, auquel toutes les instances font référence. Pour tester la présence de NULL, utilisez is.null. Vous ne pouvez pas définir attributs sur NULL.

Donc par définition NULL est très différent des vecteurs de longueur nulle. Un vecteur de longueur zéro est très n'est pas absent. NULL est vraiment un fourre-tout pour quelque chose d'absent ou de non fixé, mais pas pour l'absence, qui est le travail de NA . Il existe une exception, la liste de paires de longueur nulle, comme mentionné par @Owen. La définition du langage stipule :

Une liste de paires de longueur nulle est NULL, comme on pourrait s'y attendre en Lisp mais contrairement à une liste de longueur nulle.

qui met en évidence l'exception dans ce cas.

Pour tester un vecteur de longueur nulle, utilisez quelque chose comme if(length(foo) == 0L) par exemple. Et combinez cela avec un contrôle de classe ( is.character(foo) ) si vous souhaitez un type spécifique de vecteur de longueur nulle.

11voto

Owen Points 14439

Les autres gars ont les bonnes réponses, mais je veux ajouter quelques curiosités.

D'abord, ce n'est pas tout à fait Il est vrai que NULL "est utilisé chaque fois qu'il est nécessaire d'indiquer ou de spécifier qu'un objet est absent" comme il est dit dans la doc. Il existe en fait 2 autres valeurs "no data" dans R (sans compter NA, qui n'est pas une valeur complète).

Il y a "missing", qui est utilisé pour les arguments manquants :

alist(x=)$x

identical(NULL, alist(x=)$x) [1] FALSE y = alist(x=)$x y Error: argument "y" is missing, with no default

Ensuite, il y a "unbound", auquel vous ne pouvez pas (AFAIK) accéder directement, mais en utilisant C :

SEXP getUnbound(void) {
    return R_UnboundValue;
}

> x = .Call("getUnbound")
> x
Error: object 'x' not found

10voto

joran Points 68079

Voici une réponse partielle, en commençant par citer simplement le guide de définition du langage R :

Il existe un objet spécial appelé NULL. Il est utilisé chaque fois qu'il est besoin d'indiquer ou de spécifier qu'un objet est absent. Il ne doit pas être confondre avec un vecteur ou une liste de longueur nulle. L'objet NULL n'a pas de type et aucune propriété modifiable. Il n'y a qu'un seul objet NULL dans R, auquel toutes les instances font référence. Pour tester la présence de NULL, utilisez is.null. Vous ne pouvez pas définir des attributs sur NULL.

J'en déduis que les vecteurs de longueur zéro peuvent avoir des attributs, alors que NULL ne peut pas :

> x <- character(0)
> y <- NULL
> attr(x,"name") <- "nm"
> attr(y,"name") <- "nm"
Error in attr(y, "name") <- "nm" : attempt to set an attribute on NULL

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