È possibile dirottare qualsiasi funzione non generico, renderlo (S3) generico e impostare la versione originale essere la versione predefinita. Ad esempio:
## make an S3 generic for sd
sd <- function(x, ...) UseMethod("sd")
## take the usual definition of sd,
## and set it to be the default method
sd.default <- stats::sd
## create a method for our class "foo"
sd.foo = function(x, ...) print("Hi")
Una fase finale, se questo è in un pacchetto, è quello di aggiungere un argomento ...
per sd.default
per consentire passaggio di assegni pacchetto:
formals(sd.default) <- c(formals(sd.default), alist(... =))
dando:
> args(sd.default)
function (x, na.rm = FALSE, ...)
NULL
> args(stats::sd)
function (x, na.rm = FALSE)
NULL
Questo dà quindi il comportamento desiderato:
> bar <- 1:10
> sd(bar)
[1] 3.027650
> class(bar) <- "foo"
> sd(bar)
[1] "Hi"
Questo è documentato in section 7.1 delle estensioni di scrittura R manuali
fonte
2011-01-18 23:26:48
Meglio inviare una email a R-devel e richiedere che 'sd' (o meglio' var') sia reso generico. – hadley
@hadley è d'accordo, ma oltre alla necessità per R Core di mantenerlo, c'è un impatto sulle prestazioni quando si crea qualcosa di generico, da qui la formulazione e il consiglio nella R Ext. Manuale. –
Non compro quelle scuse. Perché dovrebbe significare generico e non var? – hadley