Leider Dinge wie (f+g)(3)
wo f und g sind beide unäre Funktionen arbeiten nicht in R. Daher habe ich versucht, den "+" - Operator für unäre Funktionen in der folgenden Weise zu überlasten:Operator überladen für Funktionen in R - merkwürdiges Verhalten
"+.function" = function(e1, e2){
return(function(x) e1(x) + e2(x))
}
Aber wenn ich versuche, dies zu verwenden, tut das nichts. Der Code
a = function(x) 2*x
(a+a)(2)
produziert den gleichen Fehler wie wenn +.function
nicht einmal definiert.
Nach einiger Zeit habe ich herausgefunden, dass es tatsächlich eine Möglichkeit gibt, Funktionen auf diese Weise hinzuzufügen: Wenn die Funktionen Mitgliederfunktionen einer Referenzklasse sind, funktioniert das! Das heißt, der folgende Code (zusammen mit der "+" Definition von oben)
clsA = setRefClass("clsA",
methods = list(
b = function(x) 2*x
))
inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)
returns "8" (wie erwartet). Daher habe ich bereits eine Art Workaround für mein Problem. Jetzt sind meine Fragen:
Was ist der Grund für dieses seltsame Verhalten? Warum kümmert sich +.function
nicht um die "normale" Funktion, sondern um die Mitgliederfunktionen? Hat jemand eine Idee wie man den Operator auf übliche Funktionen "erweitert"?
Wenn Sie die Klasse von a beispielsweise class (a) <- "test" erneut definieren und Ihre "+ .function" als "+ .test" definieren, funktioniert (a + a) (2). So scheint es, dass die Funktionsklasse irgendwie speziell ist. –
Schön, das klappt :-) Nun, man könnte dies noch als Workaround betrachten, aber ich denke es ist eine viel "schlauere" Problemumgehung als meine Idee mit der Referenzklasse. Vielen Dank für diese Idee! –