Wann lohnt es sich, S4-Methoden in der R-Programmierung zu verwenden?


72

Ich programmiere regelmäßig in R in einem professionellen Kontext und schreibe auch Pakete für Kunden oder Mitarbeiter. Einige der Programmierer hier haben einen Java-Hintergrund und bestehen darauf, alles objektorientiert mit S4-Methoden zu tun. Andererseits habe ich die Erfahrung gemacht, dass S4-Implementierungen häufig schlechter abschneiden und viel mehr Kopfschmerzen verursachen, wenn Sie versuchen, den Code dazu zu bringen, das zu tun, was Sie möchten.

Ich stimme definitiv zu, dass Sie in einigen Fällen in der Lage sein müssen, komplexe Objekte zu konstruieren oder vorhandene Objekte kontrolliert anzuhängen. Meistens können S4-Implementierungen jedoch auch problemlos mit klassischen Listen durchgeführt werden, ohne den Aufwand, standardGeneric, Methoden, Konstruktoren, Initialisierer und dergleichen zu definieren.

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

EDIT: Aus Gründen der Klarheit schätze ich die Antworten und die Diskussion über OO im Allgemeinen in R. OOP kann in R auf vielfältige Weise durchgeführt werden, aber meine Frage zielt wirklich auf den Mehrwert der Verwendung von S4-Methoden speziell ab.


Aber S3 ist eine legitime Objektorientierung! Es ist noch moderner und flexibler als S4.
mbq

2
@Joris Mehrfachvererbung? Kann durch Zusammenführen von Objekten und deren Klassen mit erfolgen c. Formale Validierung? Niemand sagte, OOP müsse mit strenger Eingabe durchgeführt werden; Smalltalk ist ein spektakuläres Beispiel. Im Allgemeinen denke ich, dass OOP nur eine Art und Weise ist, und daher gibt es keine "kanonische" OOP (trotzdem wählen die Leute normalerweise ihre Lieblingssprache aus und sagen, dass sie sie definiert).
mbq

1
@mbq: OK, dann kommst du zu dem Punkt, was OOP ist und was nicht. Sie können die objektorientierte Methode einfach programmieren, indem Sie nur Listen verwenden und alle Attribute manuell festlegen. Meine Kollegen mit Java-Hintergrund nennen etwas OOP, wenn es Sie dazu zwingt, es objektorientiert zu tun. S3 nicht, S4 für sie, und ich fühle es genauso. Ihre Meile kann variieren, aber ich denke, Sie stimmen zu, dass S3 und S4 zwei verschiedene Bestien sind. Ich wollte einige Ideen zur Verwendung von S4, keine semantische Diskussion darüber, was genau OOP in R. ist
Joris Meys

2
Ich denke, ein Teil des Problems besteht darin, dass weder S3 noch S4 eine OO-Struktur bieten, die wirklich dem entspricht, was jemand aus einer Java / C ++ - Welt gewohnt ist. Für jemanden, der sich damit auskennt, wird alles fremd erscheinen Stil von OO gegen jemanden mit Exposition gegenüber Lisp, Dylan usw.
Geoffjentry

1
@geoffjentry Guter Punkt! Und das macht sie nicht "weniger OO".
mbq

Antworten:


25

Ich gehe davon aus, dass dies nicht direkt auf Sie zutrifft, aber wenn Sie Pakete für Bioconductor entwickeln, besteht ein Anreiz, S4 zu verwenden, da diese die Verwendung aktiv fördern und dies seit fast einem Jahrzehnt tun - also den gesamten Kern Pakete nutzen S4 stark.

Ich finde, dass all der zusätzliche Aufwand ein Schmerz ist - setGeneric, setMethod, der Umgang mit NAMESPACE usw. Abgesehen davon finde ich, dass sich die auferlegte Struktur, das Potenzial für Erweiterbarkeit und andere solche Dinge lohnen können. Wie bei allem gibt es Kompromisse. Ich denke, es kann viel sauberer sein - ich mag es nicht, wie S3-Methoden einfach durch Namenskonventionen (foo.class) getarnt werden. Abgesehen davon vermeide ich es, S4 in meinem eigenen Code stark zu verwenden, es sei denn, ich werde dazu aufgefordert.


27

Meine Erfahrung stimmt mit Ihrer überein, daher verwende ich ausschließlich S3.

Zur Verdeutlichung: S4 verfügt über einige raffinierte Funktionen (z. B. Versand mehrerer Argumente und Überprüfung des Steckplatztyps), aber ich bin nicht auf eine Situation gestoßen, in der die Funktionen die Kosten überwogen. Beispiele für die Kosten sind: Jede Slot-Änderung erfordert eine vollständige Objektkopie und (möglicherweise noch schlimmer) die laufenden Änderungen an den S4-Methoden.

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


1
Also, fünf Jahre später… sind Sie weiter bei S3 geblieben?
Isomorphismen

4
@isomorphismes: yep. Ich interessiere mich jedoch für R6 als Alternative zu S4.
Joshua Ulrich

1
@JoshuaUlrich: Würden Sie sagen, dass R6 eine Alternative zu S4 ist oder unterschiedliche Anwendungsfälle hat?
Histelheim

9

Gute Frage! und ich hoffe, es wird eine nachdenkliche Diskussion ausgelöst ...

Ich habe es nie benutzt und beabsichtige es auch aus folgenden Gründen nicht:

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

Ich mag Suguar, was soll ich sagen!


4
Ich benutze auch nicht S4, weil ich mag object.method(). Im R-Stil von Google heißt es: "Verwenden Sie S3-Objekte und -Methoden, es sei denn, es gibt einen starken Grund für die Verwendung von S4-Objekten oder -Methoden. Eine primäre Rechtfertigung für ein S4-Objekt wäre die Verwendung von Objekten direkt im C ++ - Code. Eine primäre Rechtfertigung für ein S4-Generikum / Methode wäre, auf zwei Argumente
Vince

12
FWIW, warum ist Google die Autorität für den R-Stil? Sollte R-Core nicht eine höhere Autorität in dieser Angelegenheit sein? (nicht, dass R-Core in ihrer Sichtweise in dieser Angelegenheit einheitlich zu sein scheint, aber ...). Das Fandom des Google R Style Guides nervt mich nur aus diesem Grund ein bisschen.
Geoffjentry

4
@geoffjentry Es gibt einen Teil von mir, der sich genau so fühlt ... aber ich bin froh, dass die Leute nur ein bisschen über Stil nachdenken. Und wenn ein Ökonom (oder Statistiker usw.) ein phonetisches Logo auf dem PDF hat, dann lese ich alles dafür. Ich bin es leid zu versuchen, Code zu lesen, der aufgrund der Formatierung und des Stils so schwer zu analysieren ist.
JD Long

3
Natürlich könnte R-Core dieses Problem leicht lösen, wenn sie Lust dazu haben. Ich nehme an, dass sie mit den Google-Richtlinien entweder vertraut sind oder sich einfach nicht darum kümmern. Bearbeiten: Nach diesem Thread ( tinyurl.com/3ydaa89 ) zu urteilen, in dem sowohl Dalgaard als auch Murdoch antworten, denke ich, dass es eher der Apathiewinkel ist.
Geoffjentry

9

Ich habe S4 gelernt, um die Spatial (sp) -Klassen für Tierspurdaten zu erweitern. Es war die beste Wahl (konsistenteste, allgemeinste und eng mit vielen GIS-Definitionen übereinstimmende) aus den verfügbaren Optionen, um zu vermeiden, dass alles, was erforderlich ist, von Grund auf neu geschrieben wird. Ich finde S4 nicht so lästig, wie viele Leute sagen, aber ich bin es jetzt gewohnt, die zugrunde liegende Struktur solcher Objekte zu untersuchen. Die Leistung ist auch gut, ich denke, es kann gut gemacht werden, obwohl es, wenn es schlecht gemacht wird, Leistungsfallen gibt.

Wenn räumliche Daten für Sie von Interesse sind, ist spatstat ein gutes Beispiel dafür, wie man viele ähnliche Dinge wie sp in S3 macht, obwohl es (wie bei scheinbar allem räumlichen ...) kaum saubere Analogien zwischen Datenstrukturen in verschiedenen Softwareprogrammen gibt .


6

S4-Klassen spielen eine wichtige Rolle in der räumlichen Statistik (sensu-Paket sp), bei der die Konvertierung von einem Datentyp zum anderen nahtlos erscheint. Die Falle dabei ist das Debuggen, das meiner Erfahrung nach bestenfalls mühsam war. Bisher habe ich es mit S3 geschafft, könnte aber in Zukunft die Verwendung von S4 in Betracht ziehen.

Mit der Zeit, da die Dinge viel herumgespielt werden, werden sie meiner Meinung nach zumindest in den Kernmerkmalen verschiedener Bereiche von R eine wichtige Rolle spielen (möglicherweise räumliche Analyse, Ökonometrie, Umweltmetrik ...).


2
Tatsächlich wird ein ständig wachsender Teil von R in S4-Klassen neu codiert, aber ich habe immer mehr Probleme bei der Verwendung dieser Pakete. Die Dokumentation ist auf die sofortige Verwendung ausgerichtet, kann jedoch nicht für die Programmierung verwendet werden. Wie Sie wissen, hatte ich auch Probleme bei der Auswertung von Funktionsargumenten mit S4-codierten Methoden einer Reihe von Paketen. Also neige ich dazu, mich von ihnen fernzuhalten, und ich hatte gehofft, jemand könnte mir eine gute Verwendung zeigen.
Joris Meys

5

Vergessen Sie nicht, dass es auch R.oo (auf CRAN) gibt, das eine dritte Möglichkeit bietet, OO in R auszuführen. Meiner Meinung nach bietet dies ein OO-System, das Programmierern, die von anderen Systemen migrieren, möglicherweise besser bekannt ist - insbesondere, anstatt generisch zu sein Funktionen (damit print (foo) dann die Klasse von foo auslösen muss) sind die Methoden an das Objekt gebunden, sodass Sie foo $ print () ausführen würden - genau wie in Python oder C ++ würden Sie foo.print ausführen ().


Ich habe das schon einmal gesehen, aber ich habe mich immer gefragt, was der zusätzliche Mehrwert ist. Abgesehen von der Semantik konnte ich keinen Unterschied zur S3-Programmierung feststellen. Aber ehrlich gesagt habe ich mich nicht tief damit beschäftigt.
Joris Meys

4

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

Ich hatte das Unglück, einige Funktionen zu erstellen, die Methoden für die Arbeit mit S3- und S4-Klassen benötigten. Es war unglaublich schmerzhaft, diesen Code über die Jahre hinweg am Laufen zu halten, da R-Core die Details zur Interaktion dieser Systeme, zur Funktionsweise von Namespaces und zur Funktionsweise der Rcmd-Prüfung mehrfach geändert hat.

Wenn Ihnen der Styleguide von Google nicht gefällt, lesen Sie die Kommentare dieser bekannten Entwickler von R-Paketen aus diesem Thread in der R-Hilfe

Frank Harrell "Wenn Sie Informatik mehr lieben als Ihre eigene Zeit schätzen, verwenden Sie S4."

Terry Therneau schrieb: Für 90 Prozent meiner Arbeit bevorzuge ich die lockeren (S3) gegenüber den starren (S4) Klassen. Meine Zusammenfassung von S4 gegen S3

S4 hat ein großes Inkrement in: 1. Belästigung beim Schreiben 2. Schwierigkeit beim Debuggen 3. Fähigkeit, sehr obskuren Code zu schreiben 4. Design

S4-Gewinne: 5. Fähigkeit, automatische Konvertierungen zu steuern 6. Überprüfen Sie den Inhalt eines Klassenobjekts


Update seit langer Zeit: Jetzt schon
Joris Meys
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.