Основная причина в том, что если вы выполняете как программирование общего назначения, так и численные вычисления, полезно иметь большой набор доступных бинарных операторов. Например, если вы храните цифры в двумерных массивах, вы можете захотеть умножить массивы по элементам или вы можете вычислить матричный продукт двух массивов. В Matlab эти два оператора: .*
и *
; в R это *
и %*%
. Python имеет resistedattempts, чтобы добавить новые операторы, и поэтому numpy дифференцирует между двумя видами продуктов, имея два класса: класс массива умножается по элементам, матричный класс умножается в смысле линейной алгебры.
Другим примером из Python является то, что для списков плюс означает конкатенацию: [1,2,3]+[4,5] == [1,2,3,4,5]
. Но для numpy массивов плюс означает элементное дополнение: array([1,2]) + array([4,5]) == array([5,7])
. Если вашему коду нужно сделать оба, вам нужно преобразовать между классами или использовать нотацию функций, что может привести к громоздкому коду, особенно в том, что касается математики.
Поэтому иногда было бы удобно иметь больше операторов для использования, и вы можете не знать заранее, к каким операторам относится конкретное приложение. Таким образом, разработчики R решили рассматривать в качестве операторов все, что называется %foo%
, и существует несколько примеров: %in%
является установленным членством, %x%
является продуктом Kronecker, %o%
является внешним продуктом. Для примера языка, который сделал это до крайности, см. Fortress (раздел 16 спецификации начинается с правил для имен операторов).
В сообщении в блоге, которое вы упомянули, автор использует графический пакет ggplot2, который определяет %+%
, чтобы обозначить какую-то комбинацию из двух элементов графика.На самом деле, похоже, он добавляет метод к голой +
(которая является общей функцией, поэтому вы можете определить, что она означает для пользовательских объектов), но она также определяет %+%
, так что вы можете использовать значение ggplot2 +
(независимо от того,) для других объектов. Если вы установите ggplot2, введите require(ggplot2)
и ?`%+%`
, чтобы просмотреть документацию этого оператора, и methods(`+`)
, чтобы увидеть, что новое определение было добавлено в +
.
В примере кода вашего «РЕДАКТИРОВАНИЯ» вы почти наверняка хотите «+», а не «% +%». –