From ripley at stats.ox.ac.uk  Mon Jan  9 21:22:53 2006
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Mon, 9 Jan 2006 20:22:53 +0000 (GMT)
Subject: [Rd] prod(numeric(0)) surprise
Message-ID: <Pine.LNX.4.61.0601092021260.21148@gannet.stats>

On Mon, 9 Jan 2006, Thomas Lumley wrote:

> On Mon, 9 Jan 2006, Martin Morgan wrote:
> 
>> I guess I have to say yes, I'd exepct
>> 
>> x <- 1:10
>> sum(x[x>10]) ==> numeric(0)
>> 
>> this would be reinforced by recongnizing that numeric(0) is not zero,
>> but nothing. I guess the summation over an empty set is an empty set,
>> rather than a set containing the number 0. Certainly these
>> 
>> exp(x[x>10]) ==> numeric(0)
>> numeric(0) + 1 ==> numeric(0)
>> 
> 
> There are some fairly simple rules in how R does it.  You do need to
> distinguish between functions (binary operators) that map two vectors of
> length n to a vector of length n and functions such as prod and sum that
> map a vector of length n to a vector of length 1.
> 
> The output of sum and prod is always of length 1, so sum(numeric(0)) and
> prod(numeric(0)) should be of length 1 (or give an error).  It is
> convenient that sum(c(x,y)) is equal to sum(x)+sum(y) and that
> prod(c(x,y)) is equal to prod(x)*prod(y), which motivates making
> sum(numeric(0)) give 0 and prod(numeric(0)) give 1.
> 
> Single argument functions such as exp(numeric(0)) seem fairly obvious: you
> have no numbers and you exponentiate them so you still have no numbers.
> You could also argue based on c() and exp() commuting.
> 
> The rules for binary operators are a little less tidy [my fault]. They
> come from the idea that x+1 should always add 1 to each element of x.  If
> you add 1 to each element of numeric(0) you get numeric(0).  The usual
> recycling rule says that the shorter vector should be repeated to make it
> the same length as the longer vector, so this is a wart.  On the other
> hand, you can't recycle a vector of length 0 to have length 1, so the
> usual recycling rule can't be applied here. This also makes matrix
> operations work, at least in the sense of getting
> matrices of the right dimension.

There is an Svr4 addendum to the original S recycling rule which R 
implements: any vector/array expression with a length-0 component has a 
length-0 result. (Note the qualifier in there.)  See `S Programming' pp. 
17,27 for more details.  So the `wart' is part of a general rule.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] prod(numeric(0)) surprise
Prof Brian Ripley