Вы можете захватить любую неуниверсальную функцию, сделать ее (S3) общей и установить исходную версию в качестве версии по умолчанию. Например:
## 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")
Последним шагом, если он находится в пакете, является добавление аргумента ...
к sd.default
, чтобы разрешить прохождение проверок пакетов:
formals(sd.default) <- c(formals(sd.default), alist(... = ))
дает:
> args(sd.default)
function (x, na.rm = FALSE, ...)
NULL
> args(stats::sd)
function (x, na.rm = FALSE)
NULL
Это тогда дает желаемое поведение:
> bar <- 1:10
> sd(bar)
[1] 3.027650
> class(bar) <- "foo"
> sd(bar)
[1] "Hi"
Это задокументировано в разделе 7.1 руководства по написанию расширений