Как вы получаете методы 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.

Другие вопросы по тегам