У меня возникли проблемы с пониманием различий в методах диспетчеризации между классами S3 и S4. Насколько я понимаю, классы S3 используют UseMethod
и находят правильный метод через атрибут class
передаваемого объекта. Классы S4 используют StandardGeneric
и работают с сигнатурами функций (я читаю Advanced R ). Но работает следующий код:
myfun <- function(x, y = NULL) {
UseMethod("myfun")
}
myfun.default <- function(x, y) {
print("default method")
}
myfun.integer <- function(x, y) {
print("S3 dispatch for integer")
}
setMethod("myfun",
signature = c(x = "matrix", y = "ANY"),
function(x, y) {
print("S4 dispatch for matrices")
}
)
setMethod("myfun",
signature = c(x = "character", y = "ANY"),
function(x, y) {
print("S4 dispatch for strings")
}
)
setMethod("myfun",
signature = c(x = "character", y = "character"),
function(x, y) {
print("S4 dispatch for string + string")
}
)
myfun(iris)
## [1] "default method"
myfun(1:10)
## [1] "S3 dispatch for integer"
myfun(matrix(0, nrow = 2, ncol = 2))
## [1] "S4 dispatch for matrices"
myfun("foo")
## [1] "S4 dispatch for strings"
myfun("foo", y = "bar")
## [1] "S4 dispatch for string + string"
Что именно здесь происходит? Я создал метод S3 под названием «myfun», для которого диспетчеризация метода S3 работает как положено. Пока все хорошо.
Но этот метод S3 также правильно отправляет методы S4, хотя я не определил StandardGeneri c для этих методов S4 (или преобразовал myfun в такие). Как так? Любой фон будет оценен.
Заранее спасибо!