Отправка метода S3 методами S4 - PullRequest
2 голосов
/ 13 апреля 2020

У меня возникли проблемы с пониманием различий в методах диспетчеризации между классами 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 в такие). Как так? Любой фон будет оценен.

Заранее спасибо!

...