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

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

(Before someone else can embarrass me with the reference)

There is a variant on the c() example discussed in "Programming with Data", page 351, for the function max().

John

John Chambers wrote:
> 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
>
>

        [[alternative HTML version deleted]]



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed Sep 06 03:04:04 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.