2009-08-25 8 views
18

Это очень простой вопрос - но, похоже, Google не очень хорошо разбирается в строках типа «% +%». Поэтому мой вопрос: что и когда есть «% +%» и тому подобное. Думаю, это своего рода слияние ?.Что такое% +%? in R

EDIT: Хорошо - я верю, на мой вопрос ответил. % X% - двоичный оператор. Итак, теперь я думаю, что буду искать Google для получения информации о том, как и когда использовать их. Мой вопрос был частично вдохновлен вчерашним вопросом - но только после того, как я увидел этот post в блоге «learning R». Проход, который вызвал мой вопрос, состоял в следующем:
Для этого будет создана новая структура данных с годовыми итогами, а затем будет объединена с существующим набором данных (имена переменных в обоих кадрах данных должны быть одинаковыми для работы) , Затем мы просто изменим структуру данных, на которой основан график.

## add total immigration figures to the plot 
total <- cast(df.m, Period ~ ., sum) 
total <- rename(total, c("(all)" = "value")) 
total$Region <- "Total" 
df.m.t <- rbind(total, df.m) 
c1 <- c %+% df.m.t 
+0

В примере кода вашего «РЕДАКТИРОВАНИЯ» вы почти наверняка хотите «+», а не «% +%». –

ответ

24

Основная причина в том, что если вы выполняете как программирование общего назначения, так и численные вычисления, полезно иметь большой набор доступных бинарных операторов. Например, если вы храните цифры в двумерных массивах, вы можете захотеть умножить массивы по элементам или вы можете вычислить матричный продукт двух массивов. В 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(`+`), чтобы увидеть, что новое определение было добавлено в +.

+0

wauw - большое спасибо Jouni! Какой прекрасный ответ - теперь все начинает иметь смысл :-) – Andreas

+0

[Python 3.5 добавляет новый двоичный оператор] (https://www.python.org/dev/peps/pep-0465/), '@' , который NumPy будет использовать для матричного умножения. – unutbu

1

Основываясь на моем быстрый взгляд на manual он может быть определен пользователем оператор инфикс, поэтому, это трудно сказать, что фактическое значение будет ...

Я думаю, бинарное дополнение.

+0

Просто равнина + является двоичным добавлением, я считаю, что% +%, похоже, не имеет ничего привязанного к нему. Попробуйте? Арифметику для получения дополнительной информации. –

15

В общем не существует %+%. Может быть, вы смотрели на this question from yesterday где

R> '%+%' <- paste 
R> "foo" %+% "bar" 
[1] "foo bar" 
R> 

и одноранговой строка конгатенации была определена. Как правило, синтаксис «процент-оператор-процент» открыт для пользовательских функций из двух аргументов, но нет (AFAIK) общепринятой версии для %+%, которую можно ожидать повсюду.