R 的箭头等号之争

丐帮净污有两派,华山剑气分二宗。有人的地方就有江湖,R 用户群里存在着箭头和等号之争。说来简单,R 语言里的赋值号,可以是等号“=”,也可以是箭头号“<-”,纯属个人喜好,没有本质区别。比如让 x 的值为 2,那么通常有两种写法:

x = 2
x <- 2

用户多个选择,世界多种颜色,本来是个好事儿。我还曾经把等号赋值的语句表示是引用别人的,箭头赋值的表示是自己写的,以此来表达对代码原作者的尊重。但是,已经有好几次有人问我为啥总用箭头,开始我还觉得奇怪,后来我惊奇地发现,R 用户居然还分箭头党和等号党,两者之间还存在党争。并且我还发现,自己不知不觉已经加入了箭头党。

搜索“赋值 箭头 等号”,第一篇就是益辉的“R的若干基因及争论”,其中的一节介绍了箭头等号之争的前世今生,兼具知识型和趣味性,读罢觉得意犹未尽。英文世界里搜索出来的结果,内容还不如这一篇详实。这其实是个历史问题,大家搁置争议共同开发就行了,连利益纠纷都不涉及,没必要你反对我我反对你的。那么,两党到底争个啥劲呢?

在本文亮相之前,箭头党反对等号党的理由,主要是认为等号存在歧义,除了可以用来赋值,还用来传递函数的参数值,具体例子我也不重复了。这是事实,可惜有漏洞:存在歧义难道就不好吗?

等号党抓住了这个漏洞,反对箭头的理由大体有两点:

  1. 第一点是,箭头输入麻烦,要按三个键(“shift+逗号键”来输入<,再输入减号),而等号方便,按一个键就行了。
  2. 第二点是,等号的歧义完全可以从语境上来区分,箭头没有存在必要,并且引起混乱。对此等号党举出了很多例子,这里也不重复了,见上文的链接。

可惜的是,第二点在我看来,举出的例子都无法让我信服,纯粹是为了反对而反对,只怕平时没人会按那些例子来写代码,因为那不是好习惯;只要养成个好习惯,比如赋值语句单独写出来,该加空格的地方加空格,那么这些混乱完全是可以避免的。我觉得用箭头来赋值,用等号来传递函数参数,各司其职,清晰明了。比如想找出代码里所有的赋值语句,搜索一下箭头就行了。等号亦然。

而第一点理由,说等号输入更省事儿,看起来无可辩驳,但事实可能完全超出预料,因为,世界上的电脑键盘何止一种。

插图1 德语键盘布局

图 1 显示的是德语键盘布局,跟英语键盘的不同之处大部分都标了出来。你会发现,输入等号需要按“shift+0”键,要按两个键才行,而箭头也是按两个,并不比等号费事。在德国市面上买到的电脑键盘都是这个模样的。等号的输入优势在这里荡然无存。 Yangliufr对这个问题谈了他的理解,其中也提到了法语键盘的问题。有人说,非英文键盘毕竟是少数。可是,人类文明进步的一个标志,就是不忽略小众人群和弱势群体的感受。大概是意识到了这一点,当前流行的 R 集成界面 Rstudio 干脆设置了个快捷键“alt+_”,同样是按两个键,不仅能输入个箭头,还在箭头前后附送两个空格!这绝对是个进步。如果有个快捷键,能一下输入等号并且送两个空格就更好了。

我用德语键盘和RStudio;另外,我从刚接触 R 就按教材用箭头,先入为主习惯了;还有就是 google 建议用箭头,而我是 google 的粉丝;除了这些现实的理由外,我还觉得箭头更酷,更男人。

这样一来,等号在我面前完败。

但我并不向别人推销箭头。拜巴别塔所赐,世界上使用 R 语言的键盘五花八门,自己怎么方便怎么来,每人背后都有自己的故事和理由,多宽容别人,世界才美好。萝卜青菜,各有所爱,大家各自享受自己的爱好和乐趣好了,不知道有什么可争论的。

R 发展的历史上发现这个问题时,事态有可能朝两个方向走:一是革命,修改 R 的规则,消灭箭头;二是改良,适应 R 的规则,允许共存。历史选择了后者。如果选择的是革命,结果亦未可知,但革命之路上经历的内战和政治斗争等带来的灾难,又是谁能预料呢?

R 的箭头等号之争》上有10条评论

  1. Yang

    我后来自己买了个美式英文键盘。确实箭头看起来很酷,我也设置一下快捷键,改用箭头吧。
    p.s. 文中引用我的地方少了个字母g。

    回复
  2. acheng99

    在你上一篇文章中,尝试了你说的在Rstudio 中的Alt-,感觉不错,不过作为从foxpro-quick basic-c-vb-python-R,一路扯淡过来,早习惯了等号,所以现在基本兼容箭头和等号,见怪不怪了,输入的时候,能记起的时候就用箭头,记不起的时候更多。。。

    回复
  3. 小语妈

    俺又来了。
    再次佩服大鹏对所有小如鸡毛的问题进行热情而周全的论证。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax