web-dev-qa-db-fra.com

Erreur dans if / while (condition) {: l'argument est de longueur zéro

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)
30
Craig Wright

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.

38
GSee

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.

15
Richie Cotton

Lorsque vous testez des valeurs NULL, vous souhaitez utiliser is.null(hic.data[[z]]).

5
Wilduck