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