Почему в R есть два оператора присваивания, `<-` и` ->`?
Я умею пользоваться <-
а также ->
и есть несколько записей о разнице между equals
назначение и назначение стрелки, но я не знаю, когда предпочесть ->
над <-
,
Похоже, что сообщество объединилось вокруг использования <-
для назначения.
Ни руководство по стилю Google R, ни руководство Tidyverse R Хэдли Викама даже не упоминают ->
в разделе назначения.
Мне любопытно, что касается конструктивных соображений, которые заставили разработчиков S/S-PLUS ввести оператор присвоения стрелки вправо ->
, В каких настройках будет использовать ->
считаться более читабельным (или легче набирать) по сравнению с <-
или же =
?
Я не знаком ни с каким другим языком, который допускает семантику правильного назначения. Какие языки вдохновили R в этом отношении?
Я ищу ответы, в которых цитируются книги / ранние проектные документы / руководства пользователя / заархивированные списки рассылки или другие ссылки, чтобы установить, что автор S / разработчик S намеревался вставить в оператор присваивания стрелки вперед.
4 ответа
От ответа на упражнение "Новый язык S" (Беккер, Чамберс и Уилкс, 1988) через Google Книги:
Когда вы набираете длинное выражение только для того, чтобы в конце запомнить, что было бы неплохо сохранить результат, стрелка вправо позволяет выполнить присваивание без повторного ввода строки.
Это говорит о том, что пользователи S работали непосредственно в консоли, без возможности редактирования строк, которые доступны в большинстве современных REPL/ интерактивных сред...
Некоторая археология: я искал в основополагающих источниках в Google Книгах. Есть три соответствующие книги:
- "Коричневая книга": S: интерактивная среда для анализа данных и графики Р. А. Беккер, JM Chambers (CRC Press, 1984)
- Расширение системы S, Беккер и Чамберс (Taylor & Francis, 1985)
Синяя книга: новый язык Беккера, Чемберс и Уилкс (Уодсворт и Брукс / Коул 1988, но переиздан в 2018 году издательством CRC Press)
- Коричневая книга не упоминает
->
в основном тексте:
- Коричневая книга не упоминает
но это в приложении:
- Расширение системы S упоминает
->
в основном тексте:
Я не могу искать большую часть книги, поэтому ->
также может быть упомянуто в приложении где-то.
- Синяя книга относится к стрелке вправо, но на самом деле, похоже, содержит опечатку:
Я подчеркиваю подчеркнутые красные отрывки как подтверждающие, что в первой подчеркнутой строке есть опечатка, которая должна быть ->
а не ←...
Вот скриншот ответа на упражнение, упомянутого выше:
Если вам нужна копия книги 1985 года, вы можете получить ее за 34,41 долл. - или 1070,99 долл. (Но с бесплатной доставкой!) ...
Я думаю, что это просто вопрос личных предпочтений.
Хотя ->
предшествующие трубы magrittr, один недавний случай использования состоит в том, что ->
может использоваться для поддержания потока слева направо в таких трубах:
library(magrittr)
input %>% fun1 %>% fun2 -> result
С другой стороны, учитывая, что <-
в основном используется, вы можете использовать <-
даже в этом случае.
Аргумент за <-
заключается в том, что он начинает строку с установленного значения, что-то вроде цели оператора, особенно если переменная результата имеет правильное имя, тогда как правая часть - это механика и, следовательно, детально подчинена результату - и каждый любит начинать с обзора и только потом углубляться в детали. Ниже мы определяем параметр k
, То, что оно равно 3, или оно определяется константой, как здесь, или сложное выражение кажется второстепенным для цели утверждения.
k <- 3
Лично я никогда не пользуюсь ->
,
Я не могу размышлять о причинах R для разрешения назначения слева направо. И, безусловно, верно, что большинство языков программирования (фактически, почти все) выполняют присваивание только справа налево.
Тем не менее, R не полностью сам по себе.
Я не знаком ни с каким другим языком, который допускает семантику правильного назначения.
Я могу вспомнить как минимум три других (семейства) языков, которые позволяют это:
Языки ассемблера часто выполняют назначение слева направо; например, влиятельный синтаксис AT&T записывает присваивание следующим образом:
movl $1, %eax
Это присваивает значение
1
в регистр EAX. (С другой стороны, синтаксис Intel x86 выполняет назначение справа налево.)Операция TI-BASIC STO ("store") записывается так:
1→A
COBOL использует несколько форм назначения слева направо:
MOVE 1 TO x ADD 2 TO x
и т.п.
Однако я сомневаюсь, что какой-либо из этих языков послужил источником вдохновения для синтаксиса присваивания R. В отличие от этого, язык программирования APL использует присваивание стрелок, и общепринято, что S (и, следовательно, косвенно R) черпал вдохновение из этого; но APL выполняет только справа налево (var ← value
).
Предполагается, что R имеет синтаксис, вполне естественный для выражения математики. Интересно отметить, что ->
на самом деле является общим обозначением в описании некоторых элементарных операций над матрицами. Например, s*R_i -> R_i
будет использоваться для обозначения операции замены строки i на s раз строки i. Что-то вроде 2*A[1,] -> A[1,]
совершенно справедливо R. Я не знаю, имели ли эти соображения какое-либо отношение к решению по проектированию, но оно показывает, что это разумный выбор для математического языка.