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

Hal*_*Ali 43 language-design r s

我知道如何使用<-->,并且有 几个 writeups上的区别equals的分配和箭头分配,但是我不知道什么时候喜欢-><-.

社区似乎已经联合使用<-了作业.

谷歌R风格指南和Hadley Wickam的tidyverse R风格指南都没有->在作业部分提及.

我很好奇设计考虑因素导致S/S-PLUS开发人员放入右箭头分配操作员->.在什么样的设置(S)将使用->被认为是更可读(或更容易输入)与<-=

我不熟悉允许右分配语义的任何其他语言.在这方面,哪些语言激发了R?

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

Ben*_*ker 49

从答案到The New S Language(Becker,Chambers和Wilks 1988)的练习,通过Google Books:

当您输入一个长表达式时,最后要记住保存结果是一个好主意,右侧箭头允许您在不重新输入行的情况下执行赋值.

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


一些考古学:我在Google Books上找到了基础资源.有三本相关书籍:

  • Brown Book:S:数据分析和图形的交互环境 RA Becker,JM Chambers(CRC出版社,1984)
  • 扩展S系统,Becker和Chambers(Taylor&Francis,1985)
  • 蓝皮书:The New S Language Becker,Chambers和Wilks(Wadsworth和Brooks/Cole 1988,但2018年重新发行!!由CRC出版社出版)

    1. 布朗书->在正文中没有提到:

在此输入图像描述

但它在附录中做了:

在此输入图像描述

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

在此输入图像描述

我无法搜索这本书,所以->也可能会在附录中提到.

  1. 蓝皮书指的是右箭头,但实际上似乎有一个拼写错误:

在此输入图像描述

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

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

在此输入图像描述

如果你想要1985年书的副本,你可以花34.41美元 - 或1070.99美元(但免运费!)...

在此输入图像描述

  • 我听说/相信在其他地方记录的那个时候在贝尔实验室使用的键盘有一个专用的左箭头键...... (3认同)
  • 信息性(+1).您(或谷歌图书)有一个小错字,使用"商会"两次应该是"钱伯斯" (2认同)

G. *_*eck 9

我认为这只是个人偏好的问题.

虽然->早期的magrittr管道,最近的一个用例是->可用于在这些管道中保持从左到右的流量:

library(magrittr)
input %>% fun1 %>% fun2 -> result
Run Code Online (Sandbox Code Playgroud)

另一方面,鉴于<-大多数<-情况下使用,即使在这种情况下也可能需要使用.

参数<-是因为它使用设置的值开始关闭行,这有点像语句的目的,特别是如果结果变量命名良好,而右侧是机制,因此细节服从于结果 - 人们喜欢从概述开始,然后才进入细节.下面我们定义参数k.它是3或它是否由常量定义,因为它在这里或复杂的表达式似乎是声明的目的附带的.

k <- 3
Run Code Online (Sandbox Code Playgroud)

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

  • ` - 的一个非常小的缺点是它的内部实现有点奇怪:`str(quote(a-> b))`给出了'b < - a`语言,即解析器在解析时实际上翻转了表达式它...... (2认同)
  • 另一点是`<-`可以更容易地跟踪对象名称.如果您正在编写以` - >`结尾的表达式进行赋值,那么您的对象名称将被水平分散,其中始终使用`<-`表示每个对象名称都可以预测. (2认同)
  • @ Mako212现货.事实上它对代码质量有害.使您的副作用(=赋值)可见,不要将它们隐藏在行尾. (2认同)

Kon*_*lph 9

我不能推测R允许从左到右分配的原因.大多数编程语言(实际上几乎所有编程语言)只执行从右到左的任务,这当然是正确的.

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

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

我能想到至少有其他三种(系列)语言允许它:

然而,我怀疑这些语言中是否有任何一种作为R的赋值语法的灵感来源.相比之下,APL编程语言使用箭头分配,并且它通常接受的是S(从而间接R)采取的灵感来自那个 ; 但是APL只执行从右到左的赋值(var ? value).


Joh*_*man 7

R意味着具有表达数学的相当自然的语法.值得注意的是,->在描述矩阵上的一些基本行操作时,这实际上是常见的符号.例如,s*R_i -> R_i将用于表示将行i替换为第i行的操作.类似的东西2*A[1,] -> A[1,]是完全有效的R.我不知道这些考虑是否与设计决策有关,但它确实表明它是数学语言的合理选择.