6 Stimmen

Wie bringt man S3-Methoden dazu, mit S4-Objekten zu arbeiten?

Ich schreibe eine S3-Methode, mit der ich arbeiten möchte jede R-Objekt, einschließlich S4-Objekte.

Das erste, was ich nicht verstehe, ist, dass S4-Klassen nicht von einer S4-Basisklasse abgeleitet zu sein scheinen, so gegeben f <- function(x) UseMethod("f") Ich kann nicht einfach eine Erklärung abgeben f.S4 Dispatch-Methode und lässt sie alle S4-Objekte abholen. (Obwohl, wenn Sie unclass ein S4-Objekt, so scheint es doch die Klasse S4 .) Wie sollte ich die Abfertigung verwalten?

Der einfachste Weg, mit diesen S4-Objekten umzugehen, scheint darin zu bestehen, sie in Listen umzuwandeln. Leider, as.list wirft einen Fehler ("keine Methode, um diese S4-Klasse in einen Vektor zu zwingen").

Dies ist mein S4-Testobjekt:

library(gWidgetstcltk)
win <- gwindow()

Die Funktionen S3Part y S3Class im methods Paket sah vielversprechend aus, aber beide werfen Fehler, wenn ich sie auf win . Frage 2 lautet also: Gibt es eine allgemeine Möglichkeit, S4-Objekte in Listen umzuwandeln?

8voto

Joris Meys Punkte 102836

S4 ist eine Superklasse (virtuelle Klasse, was auch immer, jemand möge sich bitte mit dem korrekten Namen melden), die nicht direkt zum Dispatching verwendet werden kann. Dasselbe gilt übrigens auch für S3. Sie können S3-Dispatching für S4-Klassen tun, wie Sie mit S3-Klassen tun. Nebenbei bemerkt, wenn nichts angegeben ist, wird der Aufruf von myfun auf ein S4-Objekt führt lediglich zur Funktion .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)

Wenn Sie alle S4-Methoden abfangen wollen, können Sie diese manuell in Ihrer .default-Funktion oder generischen Funktion absetzen, indem Sie isS4() . Das Hinzufügen des Dispatching in der .default-Funktion ermöglicht das automatische S3-Dispatching für einige S4-Klassen. Wenn man es in der generischen Funktion hinzufügt, werden einfach alle S4-Klassen abgefertigt, egal, was passiert:

    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)

Bezüglich Ihrer zweiten Frage: gWindow ist ein Sonderfall. Es gibt auch einen Fehler zurück, wenn es mit str(win) . Ich kenne die genaue Struktur nicht, aber es handelt sich definitiv nicht um ein normales S4-Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X