Ich habe eine S4-Klasse entwickelt, die im Wesentlichen ein data.frame mit ein wenig zusätzlichen Informationen ist. Für die Zwecke dieser Frage sind die "zusätzlichen" Merkmale dieser Klasse irrelevant. Entscheidend ist, dass die Klasse ein data.frame-Objekt enthält, das in einem der Slots gespeichert ist. (Ich habe den data.frame in einen Slot eingefügt, anstatt ihn als Superklasse zu bezeichnen, weil ich finde, dass S4-Klassen, die data.frames enthalten, aus irgendeinem Grund die data.frames zu Listen machen).R: jede Funktion ändern, die auf eine S4-Klasse angewendet wird
Hier ist ein einfaches Beispiel:
setClass('tmp_class', slots = c(df = 'data.frame'))
test_object <- new('tmp_class', df = data.frame(Num = 1:10, Let = letters[1:10]))
Nun, was ich möchte ist, es zu tun, so dass im Wesentlichen jede Funktion auf ein Objekt dieser Klasse, die auf die data.frame in Schlitz aufgebracht wird @df. Es ist einfach, Methoden zu schreiben für bestimmte Funktionen, dies zu tun, wie:
setMethod('dim', signature = c(x = 'tmp_class'), function(x) dim([email protected]))
Aber ich bin beschränkt sich auf nur die Funktionen der ich denken kann, und jede Funktion von einem Benutzer erfunden würde nicht funktionieren.
Es ist eine einfache Sache, eine Art Wrapper/Verschluss zu schreiben, eine Funktion ändern auf meiner Klasse zu arbeiten, wie folgt aus:
tmp_classize <- function(func){
function(tmp, ...){ func([email protected], ...) }
}
Also, anstatt Methoden zum Schreiben von, sagen wir, COLNAMES() oder ncol(), konnte ich nur laufen:
tmp_classize(colnames)(test_object)
oder
tmp_classize(ncol)(test_object)
Aber was ich möchte zu tun, so mehow evoze meine "tmp_classize" -Funktion auf jede Funktion automatisch auf meine Klasse angewendet. Ich kann nicht herausfinden, wie es geht. Ich dachte, wenn ich irgendwie eine "universelle Methode" mit einer Eingabesignatur der Klasse "tmp_class" aufrufen könnte und dann sys.function() verwenden würde, um die tatsächlich aufgerufene Funktion zu holen, könnte ich vielleicht etwas machen, aber A) dort sind Rekursionsprobleme B) Ich weiß nicht wie ich eine solche "universelle" Methode nennen soll. Es scheint mir, dass die Lösung, wenn sie überhaupt existiert, eine nicht-standardmäßige Bewertung erforderlich machen könnte, die ich eher vermeiden, aber gegebenenfalls anwenden könnte.
Danke!
P.S. Ich bin mir bewusst, dass dieses Unterfangen eine unkluge/schlechte Programmiertechnik ist, und ich werde es vielleicht nie wirklich in einem Paket implementieren. Trotzdem bin ich neugierig zu wissen, ob es möglich ist.
P.P.S. Ich würde mich auch für die gleiche Idee interessieren, die auf S3-Klassen angewendet wird!