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