From maechler at stat.math.ethz.ch  Tue Sep  5 10:35:12 2006
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Tue, 5 Sep 2006 10:35:12 +0200
Subject: [Rd] setMethod("Summary")
In-Reply-To: <E28E6E71-5DD8-4B38-81C9-BB6014F6C16E@soc.soton.ac.uk>
References: <C7B9E5CB-E340-445D-A5B9-FC86AB6CC1DE@soc.soton.ac.uk>
	<C4E5D78B-28AB-4A25-8112-3668F31444E4@mac.com>
	<E28E6E71-5DD8-4B38-81C9-BB6014F6C16E@soc.soton.ac.uk>
Message-ID: <17661.14016.528539.481357@stat.math.ethz.ch>

>>>>> "Robin" == Robin Hankin <r.hankin at noc.soton.ac.uk>
>>>>>     on Tue, 5 Sep 2006 08:58:23 +0100 writes:

    Robin> Dear Franklin
    Robin> thank you for this.

yes, and he *did* send it already last week.

    Robin> Your suggestion works.

and continues to do so in R-devel aka "R-2.4.0 alpha" (as of today?)

    Robin> But now I'm confused because I'm not sure how  
    Robin> the
    Robin> setGeneric() call actually helps.

Robin, I think you got confused because you are mixing S3 and S4
("max.brob" is S3).

You should (typically) not define S3 methods for S4 classes,
and you should definitely not do it in this case where Franklin 
has shown the correct S4 way.
(and for my taste you should also not do it for the "Logic" case
 in that other thread last week: It does not bring you anything and is
 ugly for me, from the point of view of S4.)

BTW: As Franklin mentioned last time, he has most probably
learned the example from the example in the 'Matrix' package.
Since we develop the Matrix package using a world-readable
subversion archive, you can always have a look there.
The  "Summary" [ "max" etc ] generic definitions are in
   https://svn.R-project.org/R-packages/trunk/Matrix/R/AllGeneric.R
BTW, the above file contains
>> ## "Summary" --- this needs some hoop jumping that may become unnecessary
>> ##               in a future version of R (>= 2.3.x):

where the hope there has not yet been fulfilled ...

Martin Maechler, ETH Zurich


    Robin> If I source:

    Robin> setClass("brob",
    Robin> representation = representation 
    Robin> (x="numeric",positive="logical"),
    Robin> prototype      = list(x=numeric(),positive=logical())
    Robin> )


    Robin> max.brob <- function(..., na.rm=FALSE){stop("not YET implemented")}


    Robin> ---ie no call to setGeneric()--- then in an R session I can do the  
    Robin> following:


    R> x <- new("brob",x=6,positive=T)
    R> max(x)
    Robin> Error in max.brob(..., na.rm = na.rm) : not YET implemented


    Robin> So max(x) calls max.brob() as intended.  Why would a call to  
    Robin> setGeneric()
    Robin> be desirable here?  What do I gain from it?


    Robin> thanks again


    Robin> Robin




    Robin> On 4 Sep 2006, at 19:58, Parlamis Franklin wrote:

    >> i believe, if the function you are trying to work with has "..." as
    >> the first formal argument (as do most if not all of the "Summary"
    >> group functions), you will need to redefine the generic in order to
    >> provide a "real" S4 argument on which to dispatch.
    >> 
    >> the following works for me (IIRC it was martin who initially pointed
    >> me in this direction, so any thanks are his).
    >> 
    >> setGeneric("max", function(x, ..., na.rm = FALSE)
    >> {
    >> standardGeneric("max")
    >> },
    >> useAsDefault = function(x, ..., na.rm = FALSE)
    >> {
    >> base::max(x, ..., na.rm = na.rm)
    >> },
    >> group = "Summary")
    >> 
    >> i don't have bleeding edge devel version installed, so i am not sure
    >> whether recent changes to S4 have mooted the above.
    >> 
    >> (also, i thought i sent this last week, but i may have neglected to
    >> make it plain text, so maybe you didn't get it)
    >> 
    >> franklin parlamis
    >> 
    >> On Sep 4, 2006, at 3:47 AM, Robin Hankin wrote:
    >> 
    >>> Hi everyone and thanks for being patient.   I've used "!.foo"() et
    >>> seq pro tem.
    >>> 
    >>> Next problem: how to define "Summary" methods for brobs.
    >>> 
    >>> ?max says
    >>> 
    >>> 'max' and 'min' are generic functions: methods can be defined for
    >>> them individually or via the 'Summary' group generic. For
    >>> this to
    >>> work properly, the arguments '...' should be unnamed.
    >>> 
    >>> OK, so what is the correct procedure to make sum() operate on brob
    >>> objects?
    >>> 
    >>> My best effort follows.
    >>> 
    Robin> [snipped]


    Robin> --
    Robin> Robin Hankin
    Robin> Uncertainty Analyst
    Robin> National Oceanography Centre, Southampton
    Robin> European Way, Southampton SO14 3ZH, UK
    Robin> tel  023-8059-7743

    Robin> ______________________________________________
    Robin> R-devel at r-project.org mailing list
    Robin> https://stat.ethz.ch/mailman/listinfo/r-devel




[Rd] setMethod("Summary")
Martin Maechler