[Rd] S3 vs S4 for a simple package
Gabor Grothendieck
ggrothendieck at gmail.com
Tue Jan 8 02:56:24 CET 2008
On Jan 7, 2008 2:34 PM, John Chambers <jmc at r-project.org> wrote:
> One thing you cannot do in S3 is to have methods that depend on anything
> but the first argument.
Actually, you can. Here are two examples.
> ### first example - Axis ###
> ### note that it can be dispatched on x or at
> Axis
function (x = NULL, at = NULL, ..., side, labels = NULL)
{
if (!is.null(x))
UseMethod("Axis", x)
else if (!is.null(at))
UseMethod("Axis", at)
else axis(side = side, at = at, labels = labels, ...)
}
<environment: namespace:graphics>
> ### second example: +.Date
> methods("+") # note S3 Date method for +
[1] +.Date +.POSIXt
> debug("+.Date") # notify if +.Date invoked
> Sys.Date() + 1 # yup. its invoked.
debugging in: `+.Date`(Sys.Date(), 1)
debug: {
coerceTimeUnit <- function(x) {
round(switch(attr(x, "units"), secs = x/86400, mins = x/1440,
hours = x/24, days = x, weeks = 7 * x))
}
if (nargs() == 1)
return(e1)
if (inherits(e1, "Date") && inherits(e2, "Date"))
stop("binary + is not defined for Date objects")
if (inherits(e1, "difftime"))
e1 <- coerceTimeUnit(e1)
if (inherits(e2, "difftime"))
e2 <- coerceTimeUnit(e2)
structure(unclass(e1) + unclass(e2), class = "Date")
}
Browse[1]> Q
> 1 + Sys.Date() # its invoked on arg 2 as well
debugging in: `+.Date`(1, Sys.Date())
debug: {
coerceTimeUnit <- function(x) {
round(switch(attr(x, "units"), secs = x/86400, mins = x/1440,
hours = x/24, days = x, weeks = 7 * x))
}
if (nargs() == 1)
return(e1)
if (inherits(e1, "Date") && inherits(e2, "Date"))
stop("binary + is not defined for Date objects")
if (inherits(e1, "difftime"))
e1 <- coerceTimeUnit(e1)
if (inherits(e2, "difftime"))
e2 <- coerceTimeUnit(e2)
structure(unclass(e1) + unclass(e2), class = "Date")
}
Browse[1]> Q
More information about the R-devel
mailing list