web-dev-qa-db-fra.com

logique (0) dans l'instruction if

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)

6
user1700890

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')}
9
efbbrown

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

5
KenHBS

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
4
AdamO