45

我知道如何使用<-and ->,并且有几篇 关于 赋值和箭头赋值之间区别的文章equals,但我不知道什么时候更->喜欢<-

似乎社区已经围绕使用<-分配。

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

我很好奇导致 S/S-PLUS 开发人员放入右箭头 assign operator 的设计考虑因素->。与or相比,在哪些设置中使用->被认为更具可读性(或更容易输入)?<-=

我不熟悉任何其他允许正确分配语义的语言。哪些语言在这方面启发了 R?

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

4

4 回答 4

51

从新 S 语言练习的答案(Becker、Chambers 和 Wilks 1988),通过 Google 图书:

当您键入一个长表达式只是为了记住最后保存结果是一个好主意时,向右箭头允许您执行分配而无需重新键入该行。

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


一些考古学:我在谷歌图书的基础资料中四处寻找。相关书籍有三本:

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

    1. ->棕皮书在正文中没有提到:

在此处输入图像描述

但它在附录中:

在此处输入图像描述

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

在此处输入图像描述

我不能搜索很多书,所以->也可能在附录中的某个地方提到。

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

在此处输入图像描述

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

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

在此处输入图像描述

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

在此处输入图像描述

于 2018-07-26T22:38:31.917 回答
10

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

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

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

另一方面,鉴于<-大多数情况下您可能希望使用<-它。

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

k <- 3

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

于 2018-07-26T21:11:28.883 回答
9

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

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

我不熟悉任何其他允许正确分配语义的语言。

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

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

    movl $1, %eax
    

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

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

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

    MOVE 1 TO x
    ADD 2 TO x
    

    等等

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

于 2018-07-27T09:58:35.037 回答
7

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

于 2018-07-26T21:56:54.063 回答