2013-03-15 5 views
8

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"?

+0

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. –

+0

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! –

Antwort

5

Wenn Sie die Klasse von a, zum Beispiel wie class(a)<-"ownfunction" (oder besser redifine noch class(a)<-c("ownfunction","function"), und machen Sie Ihren "+.function" als "+.ownfunction"

Es scheint, dass die function Klasse auf eine besondere Weise behandelt wird: Wenn Sie debug("+.function");(a+a)(2) ausführen, sehen Sie dass "+.function" nicht einmal aufgerufen wird.

EDIT: siehe Kommentare.

+0

Basiert auf Ihrer Idee: Wenn ich 'class (a) <-" function "' definiere, dann funktioniert mein ursprünglicher '+ .function'-Operator sowohl für' a' als auch für Klassenmethoden. Ich denke, das wäre die klügste Lösung. –

+0

@Patrick Das ist wahr. Ich glaube, das passiert, weil nach 'class (a) <-" function "' 'a' das Klassenattribut' "function" 'hat, was bei einer normalen Funktion nicht der Fall ist. In beiden Fällen gibt 'Klasse (a)' '' 'function' 'zurück. – QkuCeHBH

+0

Schön, obwohl 'class' function' function' als eine Klasse einer Funktion gibt, ist es nicht wirklich ein Mitglied der 'function' Klasse :) –

3

Als Abhilfe können, könnten Sie ein special operator (%...%) wie folgt definieren:

"%+%" <- function(e1, e2) { 
    return(function(x) e1(x) + e2(x)) 
} 

a <- function(x) 2*x 
(a %+% a)(2) # == 8 
+0

Das erzeugt denselben Fehler für mich als die "+ .function" -Ansatz. –

+0

Sorry, habe vergessen, '+' durch '% +%' zu ersetzen ... jetzt sollte es funktionieren – QkuCeHBH

+0

Danke, das schien etwas merkwürdig zuerst, obwohl ich die Bedeutung von% +% falsch verstanden. –