2013-03-15 24 views
8

Purtroppo le cose come (f+g)(3) dove feg sono due funzioni unari non funzionano in R. Quindi ho cercato di sovraccaricare l'operatore "+" per le funzioni unari nel seguente modo:overloading degli operatori per le funzioni in R - strano comportamento

"+.function" = function(e1, e2){ 
    return(function(x) e1(x) + e2(x)) 
} 

Ma se provo a usarlo, questo non fa nulla. Il codice

a = function(x) 2*x 
(a+a)(2) 

produce lo stesso errore come se +.function non è nemmeno definito.

Da un po 'di tempo a giocare, ho scoperto che esiste effettivamente una possibilità di aggiungere funzioni in questo modo: se le funzioni sono funzioni membro di una classe di riferimento, funziona! Vale a dire, il seguente codice (insieme al "+" definizione dall'alto)

clsA = setRefClass("clsA", 
    methods = list(
    b = function(x) 2*x 
)) 

inst_a = clsA$new() 
(inst_a$b + inst_a$b)(2) 

restituisce "8" (come previsto). Quindi ho già una sorta di soluzione alternativa per il mio problema. Ora le mie domande sono:

Qual è la ragione di questo strano comportamento? Perché la funzione "normale" non è la +.function ma le funzioni dei membri della classe? Qualcuno ha un'idea di come "espandere" l'operatore alle funzioni abituali?

+0

Se si ridefinisce la classe di a, ad esempio come la classe (a) <- "test", e si esegue "+ .function" come "+ .test", quindi (a + a) (2) funziona. Quindi sembra che la classe di funzioni sia in qualche modo speciale. –

+0

Bello, questo funziona :-) Beh, si potrebbe considerare questo ancora come una soluzione alternativa, ma penso che sia una soluzione molto più "intelligente" della mia idea con la classe di riferimento. Grazie mille per questa idea! –

risposta

5

Se si ridefiniscono la classe di a, per esempio come class(a)<-"ownfunction" (o meglio ancora class(a)<-c("ownfunction","function"), e rendere il vostro "+.function" come "+.ownfunction" , quindi

Sembra che la classe function sia trattata in un modo speciale: se si esegue debug("+.function");(a+a)(2) si vede che "+.function" non viene nemmeno chiamato.

MODIFICA: vedere i commenti.

+0

Basato sulla tua idea: Se ridefinisco 'class (a) <-" function "' rispetto al mio operatore originale '+ .function' funziona per' a' come per i metodi di classe. Penso che questa sarebbe la soluzione più intelligente. –

+0

@Patrick Questo è vero. Credo che ciò avvenga perché dopo 'class (a) <-" function "', 'a' ha l'attributo di classe' "function" 'che non è il caso di una funzione normale. Comunque, in entrambi i casi 'class (a)' restituisce '" function "'. – QkuCeHBH

+0

Bello, quindi anche se la funzione 'class' dà' function' come una classe di una funzione, non è realmente un membro della classe 'function' :) –

3

Come soluzione alternativa, è possibile definire un special operator (%...%) come questo:

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

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

Questo produce lo stesso errore per me come l'approccio '" + .function "'. –

+0

Scusa, ho dimenticato di sostituire '+' con '% +%' ... ora dovrebbe funzionare – QkuCeHBH

+0

Grazie, sembrava un po 'strano prima, anche se ho frainteso il significato di% +% .. –

Problemi correlati