Перегрузка операторов для функций в R - странное поведение
К сожалению, такие вещи, как (f+g)(3)
где f и g обе унарные функции не работают в R. Поэтому я попытался перегрузить оператор "+" для унарных функций следующим образом:
"+.function" = function(e1, e2){
return(function(x) e1(x) + e2(x))
}
Но если я попытаюсь использовать это, это ничего не делает. Код
a = function(x) 2*x
(a+a)(2)
выдает ту же ошибку, как будто +.function
даже не определяется.
Через некоторое время я обнаружил, что на самом деле есть возможность добавлять функции таким образом: если функции являются функциями-членами ссылочного класса, это работает! Т.е. следующий код (вместе с определением "+" сверху)
clsA = setRefClass("clsA",
methods = list(
b = function(x) 2*x
))
inst_a = clsA$new()
(inst_a$b + inst_a$b)(2)
возвращает "8" (как и ожидалось). Следовательно, у меня уже есть какой-то обходной путь для моей проблемы. Теперь мои вопросы:
В чем причина этого странного поведения? Почему не +.function
заботиться о "обычной" функции, но функции-члены класса? У кого-нибудь есть идеи, как "расширить" оператор на обычные функции?
2 ответа
Если вы заново определите класс a
например, как class(a)<-"ownfunction"
(или еще лучше class(a)<-c("ownfunction","function")
и сделай свой "+.function"
как "+.ownfunction"
, затем (a+a)(2)
работает.
Кажется, что function
класс обрабатывается особым образом: если вы запускаете debug("+.function");(a+a)(2)
ты видишь это "+.function"
даже не называется.
РЕДАКТИРОВАТЬ: см. Комментарии.
В качестве обходного пути вы можете определить специальный оператор (%...%
) как это:
"%+%" <- function(e1, e2) {
return(function(x) e1(x) + e2(x))
}
a <- function(x) 2*x
(a %+% a)(2) # == 8