Почему существуют два оператора присваивания: "<-" и "->" в R? - программирование
Подтвердить что ты не робот

Почему существуют два оператора присваивания: "<-" и "->" в R?

Я знаю, как использовать <- и -> и там есть несколько writeups на разнице между equals назначением присваивания и стрелкой, но я не знаю, когда предпочесть -> через <-.

Кажется, сообщество объединилось, используя <- для назначения.

Ни руководство по стилю google R, ни Hadley Wickam tidyverse R style-guide даже не упоминают -> в разделе назначения.

Мне интересно, какие конструктивные соображения привели разработчиков S/S-PLUS к назначению оператора со стрелкой справа ->. В каких настройках (-ах) будет использоваться -> считаться более читаемым (или более простым для ввода) по сравнению с <- или =?

Я не знаком ни с каким другим языком, который допускает семантику правильного присваивания. Какие языки вдохновили R в этом отношении?

Я ищу ответы, которые цитируют книги/документы о начале разработки/руководства пользователя/архивные списки рассылки или другие ссылки, чтобы установить, что намерение автора/дизайнера S заключалось в том, чтобы поставить оператор присваивания прямой стрелки.

4b9b3361

Ответ 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)

    1. В книге Брауна не упоминается -> в основном тексте:

enter image description here

но это делается в приложении:

enter image description here

  1. Расширение S System упоминает -> в основном тексте:

enter image description here

Я не могу найти большую часть книги, поэтому -> также можно упомянуть в приложении.

  1. Синяя книга относится к правой стрелке, но на самом деле, похоже, опечатка:

enter image description here

Я интерпретирую подчеркнутые красные проходы как подтверждающие, что там есть опечатка в первой подчеркнутой строке, которая должна быть -> а не ←...

Вот скриншот ответа упражнения, упомянутого выше:

enter image description here

Если вам нужна копия книги 1985 года, вы можете получить ее за 34,41 доллара - или 1070,99 долларов (но с бесплатной доставкой!)...

enter image description here

Ответ 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. Я не знаю, имели ли эти соображения какое-либо отношение к дизайнерскому решению, но это показывает, что это разумный выбор для математический язык.