Ich habe eine R6
-Klasse und möchte eine S3
-Methode dafür hinzufügen. Die Dokumentation, die ich gefunden habe, erwähnt kurz, dass, um S3
dispatch auf R6
verwenden zu können, class = TRUE
benötigt wird, aber ich konnte kein Beispiel dafür finden, wie es gemacht werden sollte.
Ich habe empirisch gesehen, dass einfach das Schreiben einer S3-Methode in der Form s3generic.r6class
funktioniert, aber ich wollte wissen, ob das richtig ist, um eine S3
-Methode für R6
zu schreiben.
Beispiel: Ich habe eine Klasse R6
, die ein list
Frage 1
Natürlich möchte ich eine Methode bereitstellen, um die zugrunde liegende Liste zu erhalten, also wollte ich eine as.list
-Methode hinzufügen. Ist es Standard, sowohl eine allgemeine S3-Funktion als auch eine öffentliche Funktion as.list
innerhalb der Klasse hinzuzufügen? Meine intuitive Antwort ist, beide hinzuzufügen.
Wenn ich jetzt ein Objekt mylist <- R6list$new(as.list(letters[1:5]))
habe, kann ich entweder as.list(mylist)
oder mylist$as.list()
aufrufen. Ist einer von denen gegenüber dem anderen bevorzugt?
Frage 2
Ist es etwas Besonderes, eine S3
-Methode für R6
classes zu schreiben, oder ist das, was ich oben geschrieben habe, ausreichend und richtig? Ich war mir nicht sicher, ob die S3
-Methode außerhalb der Klassendefinition geschrieben werden muss, oder ob R6
irgendwie eine Möglichkeit bietet, S3
-Methoden darin zu schreiben, so dass der gesamte Code, der sich auf die Klasse bezieht, lokalisiert ist.
Ich habe Winston Chang, den Autor von R6
, über dieses auf Github gefragt. Seiner Meinung nach ist der in der ersten Frage angegebene Code der richtige Weg, S3-Methoden für R6-Klassen zu schreiben.