Niestety rzeczy jak (f+g)(3)
gdzie f i g są zarówno unarne funkcje nie działają w R. Dlatego starałem się przeciążać operatora „+” dla funkcji jednoargumentowych w następujący sposób:Operator przeciążenie dla funkcji w R - dziwne zachowanie
"+.function" = function(e1, e2){
return(function(x) e1(x) + e2(x))
}
Ale jeśli spróbuję tego użyć, to nic nie da. Kod
powoduje taki sam błąd, ponieważ +.function
nie jest nawet zdefiniowany.
Przez jakiś czas bawiąc się odkryłem, że istnieje możliwość dodania funkcji w ten sposób: jeśli funkcje są funkcjami składowymi klasy odniesienia, działa to! Tj. Następujący kod (wraz z definicją "+" z góry)
clsA = setRefClass("clsA",
methods = list(
b = function(x) 2*x
))
inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)
zwraca "8" (zgodnie z oczekiwaniami). Dlatego mam już jakiś sposób obejścia mojego problemu. Teraz moje pytania to:
Jaki jest powód tego dziwnego zachowania? Dlaczego +.function
nie dba o "zwykłą" funkcję, ale funkcje członka klasy? Czy ktoś ma pomysł, jak "rozwinąć" operatora do zwykłych funkcji?
Jeśli ponownie zdefiniujesz klasę, na przykład jak klasa (a) <- "test", i ustaw "+ .funkcja" jako "+ .test", wtedy (a + a) (2) działa. Wygląda więc na to, że klasa funkcyjna jest w jakiś sposób wyjątkowa. –
Fajnie, działa to :-) Cóż, można to uznać za obejście, ale uważam, że jest to dużo "mądrzejsze" obejście niż mój pomysł z klasą odniesienia. Bardzo dziękuję za ten pomysł! –