Как вы получаете методы S3 для работы с объектами S4? - PullRequest
6 голосов
/ 06 мая 2011

Я пишу метод 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 Ответ

6 голосов
/ 06 мая 2011

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.

...