[Rd] prod(numeric(0)) surprise

Liaw, Andy andy_liaw at merck.com
Mon Jan 9 19:27:41 CET 2006


If you haven't seen this in your math courses, perhaps this would help:

http://en.wikipedia.org/wiki/Empty_set

which says, in part:

Operations on the empty set

Operations performed on the empty set (as a set of things to be operated
upon) can also be confusing. (Such operations are nullary operations.) For
example, the sum of the elements of the empty set is zero, but the product
of the elements of the empty set is one (see empty product). This may seem
odd, since there are no elements of the empty set, so how could it matter
whether they are added or multiplied (since "they" do not exist)?
Ultimately, the results of these operations say more about the operation in
question than about the empty set. For instance, notice that zero is the
identity element for addition, and one is the identity element for
multiplication.


Andy


From: Martin Morgan
> 
> 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
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 
>



More information about the R-devel mailing list