(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)[EMAIL PROTECTED]) >> setMethod("getP","brob",function(x)[EMAIL PROTECTED]) >> >> >> setMethod("c",signature(x="brob"), >> function(x, ..., recursive=FALSE){ >> xx <- [EMAIL PROTECTED] >> xpos <- [EMAIL PROTECTED] >> 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