[Rd] Expected behavior from: all(c(NA, NA, NA) < NA, na.rm = TRUE)?

Marc Schwartz marc_schwartz at comcast.net
Wed Jun 20 17:53:25 CEST 2007

Hi all,

Came across this curious behavior in:

  R version 2.5.0 Patched (2007-06-05 r41831)

A simplified example is:

> all(c(NA, NA, NA) > NA, na.rm = TRUE)
[1] TRUE

Is this expected by definition?

If one reduces this to individual comparisons, such as :

> NA > NA
[1] NA

> all(NA > NA)
[1] NA

> all(NA > NA, na.rm = TRUE)
[1] TRUE

the initial comparison on the 3 element vector would be consistent with
the last example. 

If one evaluates each side of the comparison within the parens in the
initial example, you get something along the lines of the following:

x <- c(NA, NA, NA)
x <- x[!is.na(x)]   # remove NA's (eg. mean.default(x, na.rm = TRUE))

> x

> logical(0) > NA

> all(logical(0))
[1] TRUE

If my train of thought is correct, it seems to me that the behavior
above distills down to the comparison between logical(0) and NA, which
rather than returning NA, returns logical(0). 

This would seem appropriate, given that there is no actual comparison
being made with NA, I think, since logical(0) is an 'empty' vector.

However, should all(logical(0)) return TRUE or logical(0)?  For example:

> logical(0) == logical(0)

> all(logical(0) == logical(0))
[1] TRUE

If the initial comparison of logical(0) returns logical(0), which is not

> logical(0) == TRUE

then why does all() return TRUE, if the individual comparison is not
TRUE?  By definition from ?all:

Given a sequence of logical arguments, a logical value indicating
whether or not all of the elements of x are TRUE. 
The value returned is TRUE if all of the values in x are TRUE, and FALSE
if any of the values in x are FALSE. 
If na.rm = FALSE and x consists of a mix of TRUE and NA values, the
value is NA.

Does this make any sense?


Marc Schwartz

More information about the R-devel mailing list