From tlumley at u.washington.edu  Wed Jun 20 18:48:58 2007
From: tlumley at u.washington.edu (Thomas Lumley)
Date: Wed, 20 Jun 2007 09:48:58 -0700 (PDT)
Subject: [Rd] Expected behavior from:  all(c(NA, NA, NA) < NA,
 na.rm = TRUE)?
In-Reply-To: <1182354805.3785.47.camel@Bellerophon.localdomain>
Message-ID: <Pine.LNX.4.43.0706200948580.28720@hymn08.u.washington.edu>

On Wed, 20 Jun 2007, Marc Schwartz wrote:
>
> 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

Yes.

>
> If the initial comparison of logical(0) returns logical(0), which is not
> TRUE:
>
>> logical(0) == TRUE
> logical(0)

Yes, they have different lengths, so they aren't equal.

> 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.

This is the empty set question that should probably be a FAQ.

All elements of logical(0) are  TRUE, in the vacuous sense that it has no elements.

The same sort of thing happens for any(logical(0)), which is FALSE; sum(numeric(0)), which is 0; prod(numeric(0)), which is 1; max(numeric(0)),which is -Inf; and min(numeric(0)), which is Inf.


This seems as though R is trying to be difficult, but there is a real benefit in terms of associativity:
   all(all(x),all(y)) is always the same as all(x,y) under this definition.
   prod(prod(x), prod(y)) is prod(x,y)
   min(min(x),min(y)) is min(x,y)
and so on.

The general principle is that a function made by 'reducing' a vector with an associative binary operator, when applied to an empty vector, gives the identity element for the operator. The identity element for AND is TRUE.


>
> Does this make any sense?
>

Yes, although it is initially surprising.


      -thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle



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