Ich möchte ein S4-Objekt so schreiben, dass es an Methoden übergeben werden kann, die nur ein S3-Objekt verwenden. (Es scheint so, als ob setOldClass()
damit zusammenhängen könnte, aber es ist mir nicht klar aus der Dokumentation ?)
z.B. Für ein minimales Beispiel stell dir vor, ich hätte die S3-Klasse und -Funktion:
%Vor%und ich habe das S4-Objekt
%Vor%Gibt es irgendetwas, was ich tun kann?
%Vor%gibt mir das gleiche wie
%Vor%durch nur die S4-Klasse ändern ?
Bearbeiten Mein Grundprinzip für diesen Ansatz besteht darin, alle vorhandenen Methoden für die Klasse S3 (die normalerweise von anderen Paketen stammen können) zu nutzen, ohne sie neu schreiben zu müssen. Mir ist klar, dass ein Ansatz darin besteht, eine Zwangsmethode ( setAs()
) zu schreiben, die mein S4-Objekt in ein S3-Objekt verwandelt, aber dann müsste ein Benutzer diesen Schritt immer manuell durchführen. (Während es funktioniert, bin ich auch ein wenig unklar, ob es eine schlechte Übung ist, setAs()
zu verwenden, um eine S4-Klasse in eine S3-Klasse zu übernehmen, anstatt zwischen S4-Klassen zu mappen).
Aus der Art, wie ich die Dokumentation von setOldClass
gelesen habe, klingt es so, dass S3-Objekte wie S4-Objekte wirken können. Ist das korrekt? Wenn ja, ist meine Frage dann, ob es möglich ist, das Gegenteil zu tun (vielleicht indem ich die prototype
in der Klasse S4 einstelle?).
Wenn dies nicht möglich ist, wie wäre es mit einer Erklärung der Gründe, warum dies eine schlechte Idee wäre?
Fügen Sie Ihrer S4-Klasse eine Methode hinzu, um sie in eine S3-Klasse umzuwandeln.
%Vor%Dann können Sie die S3-Methode wie folgt aufrufen:
%Vor% Wenn Sie die eine Funktion für beide Klassen S3 und S4 wiederverwenden und nicht ändern möchten, können Sie Ihre eigene Definition für $
:
Das erscheint mir allerdings ziemlich zweifelhaft. Für Anfänger wird wahrscheinlich auch eine ähnliche Methode für [[
benötigt, da eine Funktion auf ein Listenelement verweisen kann:
Und Sie werden auch Methoden für die Zuweisung benötigen:
%Vor%Aber dann hast du das Problem mit der Nummer zu referenzieren:
%Vor%Sie brauchen also noch eine andere Methode:
%Vor%Alles in allem scheint es eine Menge Arbeit für wenig Gewinn zu sein.
Eine erfolgreiche Lösung ist tatsächlich in der Dokumentation von setOldClass
:
Beachten Sie, dass das S4-Objekt die S3-Druckmethode verwenden kann. Was mich überrascht hat ist, dass dies auch für andere Methoden funktioniert, die für die Klasse S3, aber nicht für die Klasse S4 definiert sind, auch ohne zusätzliche Aufrufe von selectMethod
. Ich illustriere dies mit einem detaillierteren Beispiel über meinen Anwendungsfall mit ape::phylo
object hier: Ссылка