我知道如何使用<-
和->
,并且equals
分配和箭头分配之间存在are several writeups ,但我不知道何时比->
更喜欢<-
。
似乎社区已经团结起来使用<-
进行分配。
Google R style-guide和Hadley Wickam的tidyverse R style-guide都没有在作业部分提到->
。
我对导致S / S-PLUS开发人员在右箭头分配运算符->
中使用的设计注意事项感到好奇。与->
或<-
相比,在哪种设置下使用=
被认为更具可读性(或更容易键入)?
我不熟悉允许权利分配语义的任何其他语言。在这方面什么语言启发了R?
我正在寻找引用书籍/早期设计文档/用户手册/归档的邮件列表或其他参考文献的答案,以确定S作者/设计人员将其放入前向箭头赋值运算符的意图。
答案 0 :(得分:49)
从答案到使用 The New S Language (贝克尔,钱伯斯和威尔克斯1988年出版)中的练习,通过Google图书:
当您键入一个长表达式只是想记住最后保存结果是个好主意时,右箭头使您无需重新键入该行即可执行赋值。
这表明S用户直接在控制台中工作,而没有大多数现代REPL /交互式环境中可用的行编辑功能...
一些考古学:我在Google图书的基础资料中闲逛。有三本相关的书:
蓝皮书:新S语言 Becker,Chambers和Wilks(Wadsworth和Brooks / Cole,1988年,但在2018年由CRC Press重新发行)
->
:但是在附录中有
->
:我无法在本书中搜索太多内容,因此附录中的某个地方也可能会提到->
。
我将带下划线的红色段落解释为支持在带下划线的第一行中有错字,应为->
而不是←...
这是上面提到的练习答案的屏幕截图:
如果您想要一本1985年版的书,则可以$ 34.41或$ 1070.99的价格购买(但免运费!)...
答案 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。我不知道这些考虑是否与设计决策有关,但确实表明这是数学语言的合理选择。