Schauen Sie sich den Code für die median
Funktion an , um mit S3 zu beginnen . Wenn Sie median
an der Eingabeaufforderung tippen, wird angezeigt, dass der Text eine Zeile enthält
UseMethod("median")
Das heißt, es ist eine S3-Methode. Mit anderen Worten, Sie können median
für verschiedene S3-Klassen eine andere Funktion haben . Geben Sie Folgendes ein, um alle möglichen Medianmethoden aufzulisten
methods(median) #actually not that interesting.
In diesem Fall gibt es nur eine Methode, die Standardmethode, die für alles aufgerufen wird. Sie können den Code dafür sehen, indem Sie eingeben
median.default
Ein viel interessanteres Beispiel ist die print
Funktion, die viele verschiedene Methoden hat.
methods(print) #very exciting
Beachten Sie, dass einige der Methoden *
s neben ihrem Namen haben. Das bedeutet, dass sie im Namespace eines Pakets versteckt sind. Verwenden find
Sie diese Option , um herauszufinden, in welchem Paket sie sich befinden. Zum Beispiel
find("acf") #it's in the stats package
stats:::print.acf
Hier wird aktualisiert , um eine schnelle Überblick über die zahlreichen R Objektsysteme nach „Advanced R, 2. Auflage“ (CRC Press, 2019) von Hadley Wickham (Chief Scientist bei RStudio), die eine Web - Darstellung hat hier , bezogen auf das Kapitel über Object -Orientierte Programmierung .
Die erste Ausgabe von 2015 hat eine Web - Darstellung hier , mit dem entsprechenden Kapitel über OO hier .
Ansätze für OO-Systeme
Hadley definiert Folgendes, um zwei unterschiedliche Ansätze für die OO-Programmierung zu unterscheiden:
Funktionale OOP : Methoden (aufrufbare Codeteile) gehören zu generischen Funktionen (nicht zu verwechseln mit generischen Java / C # -Methoden ). Stellen Sie sich die Methoden in einer globalen Nachschlagetabelle vor. Die auszuführende Methode wird vom Laufzeitsystem basierend auf dem Namen der Funktion und dem Typ (oder der Objektklasse) eines oder mehrerer an diese Funktion übergebener Argumente gefunden (dies wird als "Methodenversand" bezeichnet). In Bezug auf die Syntax können Methodenaufrufe wie normale Funktionsaufrufe aussehen :
myfunc(object, arg1, arg2)
. Dieser Aufruf würde dazu führen , die Laufzeit für das Verfahren zu dem Paar zugeordnet suchen ( "myfunc", typeof (Objekt)) oder möglicherweise ( "myfunc", typeof (Objekt), typeof (arg1), typeof (arg2))wenn die Sprache das unterstützt. In R S3 gibt der vollständige Name der generischen Funktion das Paar (Funktionsname, Klasse) an . Beispiel:mean.Date
ist die Methode zur Berechnung des Mittelwerts von Datumsangaben. Versuchen Siemethods("mean")
, die generischen Methoden mit dem Funktionsnamen aufzulistenmean
. Der funktionale OOP-Ansatz findet sich beispielsweise im OO-Pionier Smalltalk , im Common Lisp Object System und in Julia . Hadley merkt an, dass "Julias Implementierung im Vergleich zu R voll entwickelt und äußerst performant ist."Eingekapseltes OOP : Methoden gehören zu Objekten oder Klassen, und Methodenaufrufe sehen normalerweise so aus
object.method(arg1, arg2)
. Dies wird als gekapselt bezeichnet, da das Objekt sowohl Daten (Felder) als auch Verhalten (Methoden) kapselt . Stellen Sie sich die Methode in einer Nachschlagetabelle vor, die an das Objekt oder die Klassenbeschreibung des Objekts angehängt ist. Die Laufzeit sucht die Methode basierend auf dem Methodennamen und möglicherweise dem Typ eines oder mehrerer Argumente. Dies ist der Ansatz, der in "populären" OO-Sprachen wie C ++, Java, C # zu finden ist.In beiden Fällen kann die Laufzeit, wenn die Vererbung unterstützt wird (wahrscheinlich auch), die Klassenhierarchie nach oben durchlaufen, bis eine Übereinstimmung mit dem Aufrufsuchschlüssel gefunden wurde.
So finden Sie heraus, zu welchem System ein R-Objekt gehört
Die R-Objektsysteme
S3
S4
RC aka "Referenzklassen"
R6
library(R6)
)self
,private
,super
) und Elementfunktionen (Funktionen Felder zugeordnet, die jedoch nicht die Methoden, nur Funktionen)Andere
Es gibt andere, wie R.oo (ähnlich wie RC), Proto (prototypbasiert, denken Sie an JavaScript) und Mutatr . "Advanced R" sagt jedoch:
Lesen Sie auch das Kapitel über Kompromisse in "Advanced R, 2nd Edition" .
quelle