Перегрузка операторов для функций в 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
Другие вопросы по тегам