Re: [Rd] setMethod("c") [was: setMethod("Summary")]

From: John Chambers <jmc_at_r-project.org>
Date: Tue 05 Sep 2006 - 15:28:12 GMT

It's all very well to go on about efficiency, but the purpose of statistical computing is insight into data, not saving CPU cycles (to paraphrase Dick Hamming).

S3 methods do some things fine; other tasks need more flexibility. One should ask what's important in a particular application and try to find tools that match the needs well.

Now, the c() function. This has been discussed in various forms (and languages) for some time. As I remember and as far as I know, the only really general way to ensure dispatch on _any_ applicable argument is to turn the computation into a pair-wise one and define the methods (NOT S3 methods) for the two arguments of the pairwise function.

I won't try to reproduce the details off the top of my head (if I locate a reference I'll pass it on), but very roughly the idea is to say something like

cWithMethods <- function(x, ...) {

   if(nargs()<3)

      cPair(x,...)
    else
      cPair(x, cWithMethods(...))
}

and then write methods for cPair().

John

Robin Hankin wrote:
> Hello everybody.
>
> I didn't see Franklin's first message; sorry.
>
> Bearing in mind Professor Ripley's comments
> on the efficiency of S4 vs S3, I'm beginning to think I
> should just stick with S3 methods for my brob objects. After
> all, S3 was perfectly adequate for the onion package.
>
> Notwithstanding that, here's my next problem. I want to define a
> brob method for "c". Using the example in package "arules" as a
> template (I couldn't see one in Matrix), I have
>
>
> setClass("brob",
> representation = representation
> (x="numeric",positive="logical"),
> prototype = list(x=numeric(),positive=logical())
> )
>
> "brob" <- function(x,positive){
> if(missing(positive)){
> positive <- rep(TRUE,length(x))
> }
> if(length(positive)==1){
> positive <- rep(positive,length(x))
> }
> new("brob",x=x,positive=positive)
> }
>
> setGeneric("getX",function(x){standardGeneric("getX")})
> setGeneric("getP",function(x){standardGeneric("getP")})
> setMethod("getX","brob",function(x){x@x})
> setMethod("getP","brob",function(x){x@positive})
>
>
> setMethod("c",signature(x="brob"),
> function(x, ..., recursive=FALSE){
> xx <- x@x
> xpos <- x@positive
> z <- list(...)
> return(
> brob(
> c(xx,do.call("c",lapply(z,getX))),
> c(xpos,do.call("c",lapply(z,getP)))
> )
> )
> }
> )
>
>
>
>
> Now, this works for something like
>
> > x <- new("brob",x=pi,positive=T)
> > c(x,x)
>
> but c(1,x) isn't dispatched to my function. How to
> deal cleanly with this case? Perhaps if any argument
> to c() is a brob object, I would like to coerce them all to brobs.
> Is this possible?
>
>
>
>
>
>
>
>
>
>
>
>
>
> --
> Robin Hankin
> Uncertainty Analyst
> National Oceanography Centre, Southampton
> European Way, Southampton SO14 3ZH, UK
> tel 023-8059-7743
>
> ______________________________________________
> R-devel@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed Sep 06 01:31:56 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 06 Sep 2006 - 11:39:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.