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

时间:2018-07-26 20:56:17

标签: r language-design s

我知道如何使用<-->,并且equals分配和箭头分配之间存在are several writeups ,但我不知道何时比->更喜欢<-

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

Google R style-guide和Hadley Wickam的tidyverse R style-guide都没有在作业部分提到->

我对导致S / S-PLUS开发人员在右箭头分配运算符->中使用的设计注意事项感到好奇。与-><-相比,在哪种设置下使用=被认为更具可读性(或更容易键入)?

我不熟悉允许权利分配语义的任何其他语言。在这方面什么语言启发了R?

我正在寻找引用书籍/早期设计文档/用户手册/归档的邮件列表或其他参考文献的答案,以确定S作者/设计人员将其放入前向箭头赋值运算符的意图。

4 个答案:

答案 0 :(得分:49)

从答案到使用 The New S Language (贝克尔,钱伯斯和威尔克斯1988年出版)中的练习,通过Google图书:

  

当您键入一个长表达式只是想记住最后保存结果是个好主意时,右箭头使您无需重新键入该行即可执行赋值。

这表明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 Press重新发行)

    1. 《褐皮书》在正文中没有提到->

enter image description here

但是在附录中有

enter image description here

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

enter image description here

我无法在本书中搜索太多内容,因此附录中的某个地方也可能会提到->

  1. 蓝皮书指的是右箭头,但实际上似乎有错字:

enter image description here

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

这是上面提到的练习答案的屏幕截图:

enter image description here

如果您想要一本1985年版的书,则可以$ 34.41或$ 1070.99的价格购买(但免运费!)...

enter image description here

答案 1 :(得分:9)

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

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

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

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

<-的参数是它以设置的值开始,这类似于语句的目的,特别是如果结果变量命名正确,而右侧是机械学等等,细节是服从结果的-人们喜欢从概述开始,然后才进入细节。下面我们定义参数k。它是3还是它是由常量定义的,还是它是复杂的表达式,似乎与该语句的目的无关。

k <- 3

我个人从不使用->

答案 2 :(得分:9)

我无法推测R允许从左到右分配的原因。当然,大多数 编程语言(实际上几乎是所有语言)仅执行从右到左的分配。

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

  

我不熟悉允许使用右分配语义的任何其他语言。

我可以想到至少三种其他允许它的语言:

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

    movl $1, %eax
    

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

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

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

    MOVE 1 TO x
    ADD 2 TO x
    

但是,我怀疑这些语言是否能为R的赋值语法提供灵感。相比之下,APL编程语言使用箭头分配,并且通常认为S(因此间接地是R)从 that 中得到启发;但APL仅执行从右到左的分配(var ← value)。

答案 3 :(得分:7)

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