oop - summenhäufigkeit - Wann lohnt es sich, S4-Methoden in der R-Programmierung zu verwenden?




summenhäufigkeit r (5)

Es war einmal, dass Roxygen2 die S4-Methoden nicht mochte. Ab 2017 (zumindest) arbeiten sie zusammen.

Ich hatte das Pech, einige Funktionen zu erstellen, die Methoden benötigten, um mit S3- und S4-Klassen zu arbeiten. Es war unglaublich peinlich, diesen Code über die Jahre in Betrieb zu halten, da R-core die Details der Interaktion dieser Systeme und die Funktionsweise von Namespaces und die Funktionsweise von Rcmd check mehrmals geändert hat.

Wenn Ihnen der Style Guide von Google nicht gefällt, sollten Sie die Kommentare dieser bekannten R-Paketentwickler aus diesem Thread in R-help beachten

Frank Harrell "Wenn Sie Informatik mehr lieben als Ihre eigene Zeit, dann benutzen Sie S4."

Terry Therneau schrieb: Für 90 Prozent von dem, was ich tue, bevorzuge ich die lose (S3) eher als die starren (S4) Klassen .... Meine Zusammenfassung von S4 vs S3

S4 hat ein großes Inkrement in: 1. Ärgernis zu schreiben 2. Schwierigkeit zu debuggen 3. Fähigkeit, sehr obskuren Code zu schreiben 4. Design

S4 Gewinne: 5. Fähigkeit, automatische Konvertierungen zu steuern 6. validiere den Inhalt eines Klassenobjekts

Ich programmiere regelmäßig in R in einem professionellen Kontext und schreibe Pakete für Kunden oder Mitarbeiter. Einige der Programmierer hier haben einen Java-Hintergrund und bestehen darauf, alles objektorientiert zu machen, indem sie S4-Methoden verwenden. Meine Erfahrung auf der anderen Seite ist, dass S4-Implementierungen oft schlechter ablaufen und viel mehr Kopfschmerzen verursachen, wenn man versucht, den Code dazu zu bringen, das zu tun, was er tun soll.

Ich stimme definitiv zu, dass Sie in einigen Fällen in der Lage sein müssen, komplexe Objekte zu konstruieren oder bestehende Objekte anzugliedern. Aber die meiste Zeit können S4-Implementierungen auch mit Hilfe von klassischen Listen durchgeführt werden, ohne den ganzen Aufwand wie das Definieren von standardGeneric, Methoden, Konstruktoren, Initializern und Ähnlichem.

Wann sollten Sie S4-Implementierungen für R schreiben?

EDIT: Zur Klarheit, ich schätze die Antworten und die Diskussion über OO im Allgemeinen in R. OOP kann in zahlreichen Möglichkeiten in R getan werden, aber meine Frage zielt wirklich auf den zusätzlichen Nutzen der Verwendung von S4 Methoden speziell.


Gute Frage! und ich hoffe, es erzeugt eine durchdachte Diskussion ...

Ich habe es nie benutzt, noch beabsichtige ich es aus den folgenden Gründen:

  1. Performance
  2. Ich habe nicht die Geduld, S4 und seine Beziehung zu S3 vollständig zu verstehen.
  3. Syntaktischer Sugar: Ich hätte lieber object.method () als Methode (object).

Ich mag Sugar, was soll ich sagen!


Ich habe S4 gelernt, um die Spatial (sp) -Klassen für Tier-Track-Daten zu erweitern. Es war die beste Wahl (konsistent, allgemein und eng mit vielen GIS-Definitionen übereinstimmend) von den verfügbaren Optionen, um zu vermeiden, dass alles von Grund auf neu geschrieben wird. Ich finde S4 nicht so beschwerlich, wie viele Leute sagen, aber ich bin es gewohnt, die zugrunde liegende Struktur von Objekten wie dieser zu erforschen. Die Leistung ist auch gut, ich denke, dass es gut gemacht werden kann, wenn es aber schlecht gemacht wird, gibt es Performance-Fallen.

Wenn räumliche Daten für Sie von Interesse sind, ist spatstat ein gutes Beispiel dafür, wie man in S3 viele ähnliche Dinge tun kann (obwohl es scheinbar alles räumliche ... gibt), gibt es kaum saubere Analogien zwischen Datenstrukturen in verschiedenen Softwares .


Meine Erfahrung entspricht Ihrer, deshalb verwende ich ausschließlich S3.

Um zu verdeutlichen: S4 hat einige raffinierte Funktionen (z. B. Dispatch für mehrere Argumente und Slot-Typ-Überprüfung), aber ich habe keine Situation gefunden, in der die Features die Kosten überwogen. Beispiele für die Kosten sind: Jede Slot-Änderung erfordert eine vollständige Objektkopie und (möglicherweise schlechter) die laufenden Änderungen an S4-Methoden.

Kurz gesagt, ich mag die Idee hinter S4, aber ich würde warten, bis es reif ist, bevor ich es in meinem eigenen Code verwende.


Vergessen Sie nicht, dass es auch R.oo (auf CRAN) gibt, das eine dritte Möglichkeit bietet, OO in R auszuführen. In meinen Augen bietet dies ein OO-System, das Programmierern, die von anderen Systemen migrieren, vertrauter sein könnte - insbesondere statt generisch zu sein Funktionen (damit print (foo) dann auf die Klasse foo verteilen muss) sind die Methoden an das Objekt gebunden, also würdest du foo $ print () tun - genau wie in python oder C ++ würdest du foo.print machen ().





s4