Почему в 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)

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

но это в приложении:

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

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

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

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

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

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

Другие вопросы по тегам