Das S3 OO-System von R ist um generische Funktionen herum zentriert, die Methoden abhängig von der Klasse des Objekts aufrufen, auf das die generische Funktion aufgerufen wird. Der kritische Punkt ist, dass die generische Funktion die entsprechende Methode aufruft, im Gegensatz zu anderen OO-Programmiersprachen, in denen die Methode in der Klasse definiert ist.
Zum Beispiel ist die Funktion mean
eine generische Funktion.
Dies wird gedruckt
%Vor% Ich habe R ein bisschen untersucht und die Funktion as
gefunden. Ich bin verwirrt von der Tatsache, dass R sagt, dass die Funktion nicht generisch ist, aber es hat immer noch Methoden.
Am Ende gibt es eine Warnung, dass as
kein generisches ist.
Könnte mir jemand erklären, was die Funktion as
ist und wie sie mit as.list
, as.data.frame
usw. verbunden ist? R sagt, dass as.list
ein generischer Code ist (wobei ich versucht bin, ein bisschen wütend auf die Inkonsistenzen innerhalb von R zu sein, weil ich erwarten würde, dass as.list
eine Methode für ein list
-Objekt von der as
generischen Funktion ist) . Bitte helfen.
as
ist kein generisches S3, aber beachten Sie, dass Sie einen TRUE erhalten haben. (Ich habe einen FALSCH.) Das bedeutet, dass Sie ein Paket geladen haben, das as
als S4-generic definiert. S3-Generika arbeiten über den Klassenversand, der eine *.default
-Funktion und die UseMethod
-Funktion verwendet. Die FALSE, die ich bekomme, bedeutet, dass für eine generische as
keine Methode definiert ist, die nachgeschlagen werden würde. Ein möglicher Grund für das Fehlen eines generischen as
ist, dass das Aufrufen einer solchen Funktion mit nur einem Datenobjekt kein "Zwangsziel" angibt. Das bedeutet, dass das Ziel in den Funktionsnamen integriert werden muss.
Nachdem as
als generisch deklariert wurde (beachten Sie die Großschreibung, was ein Hinweis darauf ist, dass dies für S4-Funktionen gilt:
Wenn ich R neustarten (und keine Bibliotheken laden, die setGeneric für 'as' aufrufen) bekomme ich:
%Vor% Aber Sie fragen "warum", natürlich immer eine gefährliche Frage bei der Diskussion des Sprachdesigns. Ich habe das letzte Kapitel von Statistical Models in S durchgesehen, das die zitierte Referenz für die meisten Hilfeseiten ist, die für den S3-Versand gelten, und keine Diskussion über Zwang oder die Funktion as
finden. Es gibt eine implizite Definition von "S3 generic", die die Verwendung von UseMethod
erfordert, aber keine Erwähnung, warum as
von dieser Strategie ausgeschlossen wurde. Ich denke an zwei Möglichkeiten: Es soll jede Art von Vererbungsambiguität bei der Anwendung des Zwangs verhindert werden, oder es ist eine Effizienzentscheidung.
Ich sollte wahrscheinlich hinzufügen, dass es eine S4 setAs
-Funktion gibt und dass Sie alle S4-Zwangsfunktionen mit showMethods("coerce")
finden können.