Как вы получаете методы S3 для работы с объектами S4?
Я пишу метод S3, который я хочу работать с любым объектом R, включая объекты S4.
Первое, что я не понимаю, это то, что классы S4 не являются производными от базового класса S4, поэтому f <- function(x) UseMethod("f")
Я не могу просто объявить f.S4
способ отправки и получения всех объектов S4. (Хотя если ты unclass
объект S4, кажется, ему дан класс S4
.) Как мне управлять отправкой?
Кажется, что самый простой способ справиться с этими объектами S4 - это преобразовать их в списки. К несчастью, as.list
выдает ошибку ("нет метода для приведения этого класса S4 к вектору").
Это мой тестовый объект S4:
library(gWidgetstcltk)
win <- gwindow()
Функции S3Part
а также S3Class
в methods
пакет выглядел многообещающе, но они оба выдают ошибки, когда я использую их на win
, Итак, вопрос 2: существует ли общий способ преобразования объектов S4 в списки?
1 ответ
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.