można przejąć żadnej funkcji non-generic, sprawiają, że (S3) rodzajowy i ustawić oryginalną wersję być domyślną wersją. Na przykład:
## 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")
Ostatnim krokiem, jeśli ten znajduje się w opakowaniu, jest dodanie ...
argument sd.default
aby umożliwić przekazywanie kontroli pakietów:
formals(sd.default) <- c(formals(sd.default), alist(... =))
podając:
> args(sd.default)
function (x, na.rm = FALSE, ...)
NULL
> args(stats::sd)
function (x, na.rm = FALSE)
NULL
To daje pożądane zachowanie:
> bar <- 1:10
> sd(bar)
[1] 3.027650
> class(bar) <- "foo"
> sd(bar)
[1] "Hi"
Jest to udokumentowane w section 7.1 rozszerzeń Pisanie R ręcznych
Lepiej wysłać na adres R-devel i zażądać, aby 'sd' (lub lepiej,' var') było generyczne. – hadley
@hadley zgodził się, ale tak samo jak potrzeba R Core do utrzymania tego, istnieje uderzenie wydajności podczas robienia czegoś generycznego, stąd też sformułowania i porady w R Ext. Podręcznik. –
Nie kupuję tych wymówek. Dlaczego ma znaczyć rodzajowy, a nie var? – hadley