为什么 R 中有两个赋值运算符,`<-` 和 `->`?

Why are there two assignment operators, `<-` and `->` in R?

我知道如何使用<-->,还有are several writeups关于equals赋值和箭头赋值的区别,但我不知道什么时候比 <-.

更喜欢 ->

社区似乎已经团结起来使用 <- 进行分配。

google R style-guide, nor Hadley Wickam's tidyverse R style-guide 甚至在作业部分都没有提到 ->

我很好奇导致 S/S-PLUS 开发人员放入右箭头赋值运算符 -> 的设计考虑。在什么情况下使用 -><-= 更具可读性(或更易于键入)?

我不熟悉任何其他允许右赋值语义的语言。哪些语言在这方面启发了 R?

我正在寻找引用书籍/早期设计文档/用户手册/存档邮件列表或其他参考资料的答案,以确定 S author/designer 在前向箭头分配中的意图运算符。

我认为这只是个人喜好问题。

虽然 -> 早于 magrittr 管道,但最近的一个用例是 -> 可用于在此类管道中保持从左到右的流动:

library(magrittr)
input %>% fun1 %>% fun2 -> result

另一方面,考虑到 <- 最常使用,即使在这种情况下,您可能也想使用 <-

<- 的参数是它以设置的值开始一行,这有点像语句的目的,特别是如果结果变量命名正确,而右侧是机制,细节也是从属于结果的——人们喜欢从概述开始,然后才进入细节。下面我们定义参数k。它是 3 还是它是由一个常量定义的,就像这里一样,还是一个复杂的表达式似乎与语句的目的无关。

k <- 3

就个人而言,我从不使用 ->

R 的语法对于表达数学来说是相当自然的。有趣的是 -> 实际上是描述矩阵上某些 elementary row operations 的常用符号。例如,s*R_i -> R_i 将用于表示将第 i 行替换为 s 次第 i 行的操作。 2*A[1,] -> A[1,] 之类的东西是完全有效的 R。我不知道这些考虑是否与设计决策有关,但它确实表明它是数学语言的合理选择。

来自 The New S Language(Becker, Chambers and Wilks 1988)中练习的答案,来自 Google 书籍:

When you type a long expression only to remember at the end that it would be a good idea to save the result, a right-hand arrow allows you to perform an assignment without retyping the line.

这表明 S 用户直接在控制台中工作,没有大多数现代 REPL/交互式环境中可用的行编辑功能...


一些考古学:我在 Google 书籍的基础资源中四处寻找。相关书籍共有三本:

  • 棕皮书:S:数据分析和图形的交互式环境 R. A. Becker、J. M. Chambers(CRC 出版社,1984 年)
  • 扩展 S 系统,贝克尔和钱伯斯(Taylor & Francis,1985 年)
  • 蓝皮书:新 S 语言 Becker、Chambers 和 Wilks(Wadsworth 和 Brooks/Cole 1988 年,但在 2018 年重新发行!! CRC 出版社)

    1. The Brown Book 在正文中没有提到 ->

但在附录中确实如此:

  1. 扩展S系统正文中提到->

我无法搜索到本书的大部分内容,因此 -> 可能还会在附录中的某处提及。

  1. 蓝皮书提到了右箭头,但实际上似乎有错别字:

我将带下划线的红色段落解释为支持第一个下划线中有错字,应该是->而不是←...

上面提到的练习答案截图如下:

如果您想要一本 1985 年的书,只需 34.41 美元或 1070.99 美元(但免运费!)...

我无法推测 R 允许从左到右赋值的原因。 大多数 编程语言(事实上,几乎所有)都只执行从右到左的赋值。

也就是说,R 并不完全独立。

I'm not familiar with any other language that allows the right-assignment semantics.

我能想到至少三种允许它的其他(家族)语言:

  • 汇编语言经常执行从左到右的赋值;例如,有影响力的 AT&T 语法这样写赋值:

    movl , %eax
    

    这会将值1 分配给EAX 寄存器。 (另一方面,Intel 的 x86 语法执行从右到左的分配。)

  • TI-BASIC的STO(“store”)操作是这样写的:

    1→A
    
  • COBOL 使用多种形式的从左到右赋值:

    MOVE 1 TO x
    ADD 2 TO x
    

然而,我怀疑这些语言中的任何一种是否为 R 的赋值语法提供了灵感。相比之下,APL 编程语言使用箭头赋值,并且普遍认为 S(因此间接地 R)从 that 中获得灵感;但 APL 只执行从右到左的赋值 (var ← value).