2

我在理解 S3 和 S4 类之间方法分派的差异时遇到了一些麻烦。据我了解,S3 类通过传递的对象UseMethod的属性使用并找到正确的方法。classS4 类使用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"

这里到底发生了什么?我创建了一个名为“myfun”的 S3 方法,S3 方法分派按预期工作。到目前为止,一切都很好。

但是这个 S3 方法也正确地分派了 S4 方法,即使我没有为这些 S4 方法定义 StandardGeneric(或将 myfun 转换为此类方法)。怎么来的?任何背景将不胜感激。

提前致谢!

4

0 回答 0