Typ / Ursprung von Rs 'as' Funktion

8

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.

%Vor%

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.

%Vor%

Am Ende gibt es eine Warnung, dass as kein generisches ist.

%Vor%

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.

    
PejoPhylo 14.01.2018, 17:28
quelle

1 Antwort

11

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:

%Vor%

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.

    
42- 14.01.2018, 18:50
quelle

Tags und Links