J'ai reçu l'erreur
Error in if (condition) { : argument is of length zero
ou
Error in while (condition) { : argument is of length zero
Qu'est-ce qui cause ce message d'erreur et qu'est-ce que cela signifie?
Après inspection, il semble que la valeur soit NULL
.
condition
## NULL
Pour faire face à cette erreur, comment puis-je tester les valeurs NULL?
Je m'attendais à ce que cela renvoie TRUE
, mais j'ai obtenu une valeur logique vide:
condition == NULL
## logical(0)
Voir ?NULL
Vous devez utiliser is.null
"Is.null" renvoie "TRUE" si son argument est "NULL" et "FALSE" sinon.
Essaye ça:
if ( is.null(hic.data[[z]]) ) { print("is null")}
De la section 2.1.6 de la Définition du langage R
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 faut pas le confondre avec un vecteur ou une liste de longueur nulle. L'objet NULL n'a aucun type et aucune propriété modifiable. Il n'y a qu'un seul objet NULL dans R, auquel toutes les instances se réfèrent. Pour tester NULL, utilisez is.null. Vous ne pouvez pas définir d'attributs sur NULL.
Qu'est-ce qui cause ce message d'erreur et que signifie-t-il?
Les instructions if
prennent une seule valeur logique (techniquement un vecteur logique de longueur un) comme entrée pour la condition.
L'erreur est levée lorsque la condition d'entrée est de longueur zéro. Vous pouvez le reproduire avec, par exemple:
if (logical()) {}
## Error: argument is of length zero
if (NULL) {}
## Error: argument is of length zero
Erreurs courantes qui conduisent à cette erreur
Il est facile de provoquer accidentellement cette erreur lors de l'utilisation de $
indexation. Par exemple:
l <- list(a = TRUE, b = FALSE, c = NA)
if(l$d) {}
## Error in if (l$d) { : argument is of length zero
Aussi en utilisant if
-else
lorsque vous vouliez dire ifelse
, ou en remplaçant T
et F
.
Notez ces erreurs et avertissements associés pour d'autres mauvaises conditions:
Erreur dans if/while (condition) {: Valeur manquante où TRUE/FALSE était nécessaire
Erreur dans if/while (condition): l'argument n'est pas interprétable comme logique
if (NA) {}
## Error: missing value where TRUE/FALSE needed
if ("not logical") {}
## Error: argument is not interpretable as logical
if (c(TRUE, FALSE)) {}
## Warning message:
## the condition has length > 1 and only the first element will be used
Comment puis-je tester ces valeurs?
NULL
les valeurs peuvent être testées pour l'utilisation de is.null
. Voir réponse de GSee pour plus de détails.
Pour sécuriser vos appels à if
, un bon modèle de code est le suivant:
if(!is.null(condition) &&
length(condition) == 1 &&
!is.na(condition) &&
condition) {
# do something
}
Vous pouvez également consulter assert_is_if_condition
de assertive.code
.
Lorsque vous testez des valeurs NULL, vous souhaitez utiliser is.null(hic.data[[z]])
.