Skip to content

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

4 messages · Peter Dalgaard, Thomas Lumley, Marc Schwartz

#
Hi all,

Came across this curious behavior in:

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


A simplified example is:
[1] TRUE


Is this expected by definition?

If one reduces this to individual comparisons, such as :
[1] NA
[1] NA
[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))
logical(0)
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)
[1] TRUE


If the initial comparison of logical(0) returns logical(0), which is not
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?

Thanks,

Marc Schwartz
#
Marc Schwartz wrote:
I don't see the problem. Isn't it just that all(logical(0))==TRUE by 
convention just like prod(numeric(0))==1 etc.?
#
On Wed, 20 Jun 2007, Marc Schwartz wrote:
Yes.
Yes, they have different lengths, so they aren't equal.
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.
Yes, although it is initially surprising.


      -thomas

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle
#
On Wed, 2007-06-20 at 09:48 -0700, Thomas Lumley wrote:
Thanks to you, Peter and Prof. Ripley for the clarifications.  It
compelled me to go back and review empty set characteristics and the
notion of 'vacuous truth'.

As it turns out, in the course of my search, there is a page on the R
Wiki by Tony Plate et al here:

http://wiki.r-project.org/rwiki/doku.php?id=tips:surprises:emptysetfuncs

which covers this and I'll add some comments on this specific example.

I'll just need to add some extra code in my application for these
special cases.

Thanks again, 

Marc