192

I received this error message:

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

or

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

What does it mean, and how do I prevent it?

Richie Cotton
  • 118,240
  • 47
  • 247
  • 360
Concerned_Citizen
  • 6,548
  • 18
  • 57
  • 75
  • 12
    The double equals operator can't tolerate an `NA` on either side. If I define: `x = NA` and then do an `if (x == NA){ ... }` then this error will be thrown at runtime when the parser examines the left hand side of the double equals. To remedy this error, make sure every variable in your conditional is not NA using `is.na(your_variable)`. – Eric Leschinski Apr 09 '17 at 01:26
  • 2
    Amazing, this solved an issue I had with an observe() function on daterangeinputs in shiny. – fullera Nov 11 '20 at 00:18

4 Answers4

226

The evaluation of condition resulted in an NA. The if conditional must have either a TRUE or FALSE result.

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

This can happen accidentally as the results of calculations:

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

To test whether an object is missing use is.na(x) rather than x == NA.


See also the related errors:

Error in if/while (condition) { : argument is of length zero

Error in if/while (condition) : argument is not interpretable as logical

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
Community
  • 1
  • 1
Brian Diggs
  • 57,757
  • 13
  • 166
  • 188
10

I ran into this when checking on a null or empty string

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

changed it to

if (is.null(x) || x == '') {
pbatey
  • 1,234
  • 13
  • 13
1

I was getting this same error in my forloops with complex if statements. I fixed this issue by just wrapping my condition with isTRUE.

if(isTRUE(condition)==TRUE) {do something}
Krutik
  • 461
  • 4
  • 13
0

this works with "NA" not for 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])
  }
Seyma Kalay
  • 2,037
  • 10
  • 22