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

Peter Dalgaard p.dalgaard at biostat.ku.dk
Wed Jun 20 18:37:15 CEST 2007

```Marc Schwartz wrote:
> 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)
>
>
>> logical(0) > NA
>>
> logical(0)
>
>
>> 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)
>>
> logical(0)
>
>
>> all(logical(0) == logical(0))
>>
> [1] TRUE
>
>
> If the initial comparison of logical(0) returns logical(0), which is not
> TRUE:
>
>
>> logical(0) == TRUE
>>
> logical(0)
>
> 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?
>
I don't see the problem. Isn't it just that all(logical(0))==TRUE by
convention just like prod(numeric(0))==1 etc.?

```