我在理解 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"
这里到底发生了什么?我创建了一个名为“myfun”的 S3 方法,S3 方法分派按预期工作。到目前为止,一切都很好。
但是这个 S3 方法也正确地分派了 S4 方法,即使我没有为这些 S4 方法定义 StandardGeneric(或将 myfun 转换为此类方法)。怎么来的?任何背景将不胜感激。
提前致谢!