182 votes

Erreur dans if/while (condition) { : valeur manquante là où TRUE/FALSE est nécessaire

J'ai reçu ce message d'erreur :

Error in if (condition) { : missing value where TRUE/FALSE needed

ou

Error in while (condition) { : missing value where TRUE/FALSE needed

Qu'est-ce que cela signifie, et comment puis-je l'éviter ?

10 votes

L'opérateur double égal ne peut tolérer un NA de chaque côté. Si je définis : x = NA et ensuite faire un if (x == NA){ ... } alors cette erreur sera signalée au moment de l'exécution lorsque l'analyseur syntaxique examinera le côté gauche de la double égalité. Pour remédier à cette erreur, assurez-vous que chaque variable de votre conditionnel n'est pas NA en utilisant la fonction is.na(your_variable) .

2 votes

Incroyable, cela a résolu un problème que j'avais avec une fonction observe() sur les daterangeinputs dans shiny.

221voto

Brian Diggs Points 22433

L'évaluation de condition a donné lieu à un NA . Le site if conditionnel doit avoir soit un TRUE ou FALSE résultat.

if (NA) {}
## Error in if (NA) { : missing value where TRUE/FALSE needed

Cela peut arriver accidentellement comme résultat de calculs :

if(TRUE && sqrt(-1)) {}
## Error in if (TRUE && sqrt(-1)) { : missing value where TRUE/FALSE needed

Pour vérifier si un objet est manquant, utilisez is.na(x) plutôt que x == NA .


Voir également les erreurs connexes :

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

Erreur dans if/while (condition) : l'argument n'est pas interprétable comme logique.

if (NULL) {}
## Error in if (NULL) { : argument is of length zero

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

10voto

pbatey Points 21

J'ai rencontré ce problème lors de la vérification d'une chaîne de caractères nulle ou vide.

if (x == NULL || x == '') {

l'a changé en

if (is.null(x) || x == '') {

1 votes

Fyi, il y a aussi !(length(x) == 1L && nzchar(x))

0voto

Krutik Points 375

J'ai eu la même erreur dans mon forloops avec complexe if déclarations. J'ai résolu ce problème en enveloppant simplement ma condition avec isTRUE .

if(isTRUE(condition)==TRUE) {do something}

0voto

Seyma Kalay Points 20

Cela fonctionne avec "NA" pas pour NA

comments = c("no","yes","NA")
  for (l in 1:length(comments)) {
    #if (!is.na(comments[l])) print(comments[l])
    if (comments[l] != "NA") print(comments[l])
  }

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