Cette ligne:
which(!is.na(c(NA,NA,NA))) == 0
produit logical(0)
Bien que cette ligne
if(which(!is.na(c(NA,NA,NA))) == 0){print('TRUE')}
génère:
Error in if (which(!is.na(c(NA, NA, NA))) == 0) { :
argument is of length zero
Pourquoi y a-t-il une erreur? Qu'est-ce qui est logique (0)
logical(0)
est un vecteur de classe logique de longueur 0. Vous obtenez cela parce que vous demandez quels éléments de ce vecteur sont égaux à 0:
> !is.na(c(NA, NA, NA))
[1] FALSE FALSE FALSE
> which(!is.na(c(NA, NA, NA))) == 0
logical(0)
Dans la ligne suivante, vous demandez si ce vecteur de longueur nulle logical(0)
est égal à 0, ce qui n'est pas le cas. Vous obtenez une erreur car vous ne pouvez pas comparer un vecteur de longueur 0 avec un scalaire.
Au lieu de cela, vous pouvez vérifier si la longueur de ce premier vecteur est 0:
if(length(which(!is.na(c(NA,NA,NA)))) == 0){print('TRUE')}
Tout d'abord, logical(0)
indique que vous avez un vecteur qui est censé contenir des valeurs booléennes, mais le vecteur a une longueur nulle.
Dans votre première approche, vous
!is.na(c(NA, NA, NA))
# FALSE, FALSE, FALSE
L'utilisation de la fonction which()
sur ce vecteur produira un vecteur entier vide (integer(0)
). Tester si un ensemble vide est égal à zéro, conduira donc à un vecteur booléen vide.
Dans votre deuxième approche, vous essayez de voir si le vecteur which(!is.na(c(NA,NA,NA))) == 0
est TRUE
ou FALSE
. Cependant, ce n'est ni l'un ni l'autre, car il est vide. L'instruction if
- a besoin d'un TRUE
ou d'un FALSE
. C'est pourquoi cela vous donne une erreur argument is of length zero
Appeler which
pour vérifier si un vecteur de logique est faux est une mauvaise idée. which
vous donne un vecteur d'indices pour les valeurs VRAIES. S'il n'y en a pas, ce vecteur est de longueur 0. Une meilleure idée est d'utiliser any
.
> any(!is.na(c(NA,NA,NA)))
FALSE