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 Sie methods("mean")
, die generischen Methoden mit dem Funktionsnamen aufzulisten mean
. 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
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Die R-Objektsysteme
S3
- Funktionaler OOP-Ansatz.
- Wichtigstes System nach Hadley.
- Am einfachsten, am häufigsten. Erstes OO-System von R.
- Kommt mit Basis R, die in der gesamten Basis R verwendet wird.
- Verlässt sich eher auf Konventionen als auf erzwungene Garantien.
- Siehe Chambers, John M und Trevor J Hastie. 1992. Statistische Modelle in S. Wadsworth & Brooks / Cole Fortgeschrittene Bücher & Software.
- Details in "Advanced R, 2. Auflage" hier .
S4
- Funktionaler OOP-Ansatz.
- Drittwichtigstes System nach Hadley.
- Umschreiben von S3, daher ähnlich wie S3, jedoch formeller und strenger: Es zwingt Sie, sorgfältig über das Programmdesign nachzudenken. Geeignet für den Bau großer Systeme (z. B. das Bioconductor- Projekt).
- Implementiert im Basispaket "Methoden".
- Siehe: Chambers, John M. 1998. "Programmieren mit Daten: Ein Leitfaden für die S-Sprache." Springer.
- Details in "Advanced R, 2. Auflage" hier .
RC aka "Referenzklassen"
- Eingekapselter OOP-Ansatz.
- Kommt mit Basis R.
- Basierend auf S4.
- RC-Objekte sind spezielle S4-Objekte, die auch "veränderlich" sind. Das heißt, anstatt die übliche Semantik zum Kopieren und Ändern von R zu verwenden, können sie direkt geändert werden. Beachten Sie, dass der veränderbare Status schwer zu begründen ist und hässliche Fehler verursacht, in bestimmten Anwendungen jedoch zu effizienterem Code führen kann.
R6
- Eingekapselter OOP-Ansatz.
- Zweitwichtigstes System nach Hadley.
- Kann im R6- Paket gefunden werden (installieren mit
library(R6)
)
- Ähnlich wie RC, aber leichter und viel schneller: Es hängt nicht von S4 oder dem Methodenpaket ab . Errichtet auf R-Umgebungen. Hat auch:
- öffentliche und private Methoden
- aktive Bindungen (Felder, die beim Zugriff tatsächlich eine Methode aufrufen)
- Klassenvererbung, die paketübergreifend funktioniert
- beide Klassenmethoden (Code, der zu der Klasse gehört , und eine Instanz über zugreifen kann
self
, private
, super
) und Elementfunktionen (Funktionen Felder zugeordnet, die jedoch nicht die Methoden, nur Funktionen)
- Bietet eine standardisierte Möglichkeit, sich der Semantik "Copy-on-Modify" von R zu entziehen
- Siehe die Paketseite: "R6: Eingekapselte objektorientierte Programmierung für R" .
- Details in "Advanced R, 2. Auflage" hier .
Andere
Es gibt andere, wie R.oo (ähnlich wie RC), Proto (prototypbasiert, denken Sie an JavaScript) und Mutatr . "Advanced R" sagt jedoch:
Abgesehen von R6, das weit verbreitet ist, sind diese Systeme in erster Linie von theoretischem Interesse. Sie haben ihre Stärken, aber nur wenige R-Benutzer kennen und verstehen sie, sodass es für andere schwierig ist, Ihren Code zu lesen und dazu beizutragen.
Lesen Sie auch das Kapitel über Kompromisse in "Advanced R, 2nd Edition" .