S4 - это суперкласс (виртуальный класс, что угодно, кто-нибудь, пожалуйста, введите правильное имя), который нельзя использовать для прямой отправки.То же самое для S3, кстати.Вы можете выполнять диспетчеризацию S3 для классов S4 так же, как и с классами S3.В отношении sidenote, если ничего не указано, то вызов myfun
для объекта S4 просто приведет к функции .default.:
myfun <- function(object, ...) UseMethod("myfun")
myfun.default <- function(object,...){
cat("default method.\n")
print(object)
}
myfun.gWindow <- function(object,...){
cat("Here here...")
print(object)
}
x <- 1:10
myfun(x)
myfun(win)
rm(myfun.gWindow)
myfun(win)
Если вы хотите перехватить все методы S4, вы можете отправить их вручную в функции .default или обобщенной функции, используя isS4()
.Добавление диспетчеризации в функцию .default позволяет автоматически отправлять S3 некоторым классам S4.Если вы добавите его в универсальный, вы просто отправите на все S4, несмотря ни на что:
myfun.default <- function(object,...){
if(isS4(object)) myfun.S4(object,...)
else {
cat("default method.\n")
print(object)
}
}
myfun.S4 <- function(object,...){
cat("S4 method\n")
print(object)
}
x <- 1:10
myfun(x)
myfun(win)
По поводу вашего второго вопроса: gWindow
- особый случай.Он также возвращает ошибку при попытке с str(win)
.Я не знаю точную структуру, но это определенно не обычный объект S4.