From mtmorgan at fhcrc.org  Mon Jan  9 19:16:41 2006
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Mon, 09 Jan 2006 10:16:41 -0800
Subject: [Rd] prod(numeric(0)) surprise
In-Reply-To: <43C2A149.5030903@stats.uwo.ca> (Duncan Murdoch's message of
	"Mon, 09 Jan 2006 12:45:45 -0500")
References: <43C1C973.8080702@zoo.ufl.edu> <43C1CBB9.7090307@stats.uwo.ca>
	<43C1CD05.2030504@zoo.ufl.edu>
	<17346.5951.435355.767827@stat.math.ethz.ch>
	<6phslrxz4dg.fsf@gopher3.fhcrc.org> <43C2A149.5030903@stats.uwo.ca>
Message-ID: <6phirstz2pi.fsf@gopher3.fhcrc.org>

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)

would give me pause.


Gabor Grothendieck <ggrothendieck at gmail.com> writes:

> The way to think about it is:
>
>    prod(rep(x,n)) == x^n
>
> and that works for n=0 too.

Hmm, Not sure what to put in for x and n? do you mean x == numeric(0),
n == 0 (0 copies of an empty set), x == ANY n == numeric(0) (an empty
set of ANYthing), x == numeric(0), n == numeric(0) ? For all of these,
x^n evaluates to numeric(0).

Martin (Morgan)

Duncan Murdoch <murdoch at stats.uwo.ca> writes:

> On 1/9/2006 12:40 PM, Martin Morgan wrote:
>> I'm a little confused. I understand that numeric(0) means an empty
>> numeric vector, not the number 0 expressed as numeric. As it is now,
>> prod(numeric(0)) generates something -- a vector of length 1
>> containing the number 1 -- from nothing. I would have expected
>> prod(numeric(0)) ==> numeric(0)
>> this is consistent with
>> numeric(0) ==> numeric(0)
>> numeric(0) * 1 ==> numeric(0)
>> cumprod(numeric(0)) ==> numeric(0)
>> and, because concatenation occus before function evaluation,
>> prod(c(numeric(0),1)) ==> prod( c(1) ) ==> 1
>> I would expect sum() to behave the same way, e.g., sum(numeric(0))
>> ==>
>> numeric(0). From below,
>>
>
> I think the code below works as I'd expect.  Would you really like the
> last answer to be numeric(0)?
>
>  > x <- 1:10
>  > sum(x)
> [1] 55
>  > sum(x[x>5])
> [1] 40
>  > sum(x[x>10])
> [1] 0
>
> Duncan Murdoch
>
>>>     >>>> consider exp(sum(log(numeric(0)))) ... ?)
>>>     >>     >> That's a fairly standard mathematical convention,
>>> which
>>>     >> is presumably why sum and prod work that way.
>>>     >>     >> Duncan Murdoch
>> I would have expected numeric(0) as the result (numeric(0) is the
>> result from log(numeric(0)), etc).
>> Martin (Morgan)
>> Martin Maechler <maechler at stat.math.ethz.ch> writes:
>>
>>>>>>>> "Ben" == Ben Bolker <bolker at zoo.ufl.edu>
>>>>>>>>     on Sun, 08 Jan 2006 21:40:05 -0500 writes:
>>>
>>>     Ben> Duncan Murdoch wrote:
>>>     >> On 1/8/2006 9:24 PM, Ben Bolker wrote:
>>>     >>     >>> It surprised me that prod(numeric(0)) is 1.  I guess
>>> if
>>>     >>> you say (operation(nothing) == identity element) this
>>>     >>> makes sense, but ??
>>>     >>     >>     >> What value were you expecting, or were you
>>> expecting an
>>>     >> error?  I can't think how any other value could be
>>>     >> justified, and throwing an error would make a lot of
>>>     >> formulas more complicated.
>>>     >>     >>>
>>>     >>     >>>> consider exp(sum(log(numeric(0)))) ... ?)
>>>     >>     >> That's a fairly standard mathematical convention,
>>> which
>>>     >> is presumably why sum and prod work that way.
>>>     >>     >> Duncan Murdoch
>>>
>>>     Ben>    OK.  I guess I was expecting NaN/NA (as opposed to
>>>     Ben> an error), but I take the "this makes everything else
>>>     Ben> more complicated" point.  Should this be documented or
>>>     Ben> is it just too obvious ... ?  (Funny -- I'm willing to
>>>     Ben> take gamma(1)==1 without any argument or suggestion
>>>     Ben> that it should be documented ...)
>>>
>>> see?  so it looks to me as if you have finally convinced
>>> yourself that '1' is the most reasonable result.. ;-)
>>>
>>> Anyway, I've added a sentence to help(prod)  {which matches
>>> the sentence in help(sum), BTW}.
>>>
>>> Martin
>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] prod(numeric(0)) surprise
Martin Morgan