为什么 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 出版社)
- The Brown Book 在正文中没有提到
->
:
但在附录中确实如此:
- 扩展S系统正文中提到
->
:
我无法搜索到本书的大部分内容,因此 ->
可能还会在附录中的某处提及。
- 蓝皮书提到了右箭头,但实际上似乎有错别字:
我将带下划线的红色段落解释为支持第一个下划线中有错字,应该是->
而不是←...
上面提到的练习答案截图如下:
如果您想要一本 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
).
我知道如何使用<-
和->
,还有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 出版社)
- The Brown Book 在正文中没有提到
->
:
- The Brown Book 在正文中没有提到
但在附录中确实如此:
- 扩展S系统正文中提到
->
:
我无法搜索到本书的大部分内容,因此 ->
可能还会在附录中的某处提及。
- 蓝皮书提到了右箭头,但实际上似乎有错别字:
我将带下划线的红色段落解释为支持第一个下划线中有错字,应该是->
而不是←...
上面提到的练习答案截图如下:
如果您想要一本 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
).