作为一门高级语言,R语言拥有独特的语法。比如今天要说的赋值符号。在其他语言里,这个符号通常用一个等号表示(=),而在R语言里,承担这个任务的是箭头符(<-)。这也是我讨厌R语言的一个重要原因。因为R的很多语法在其他语言里无法借鉴,而且还要记一堆只有在R里才能用到的参数。而且大多数情况下等号和箭头可以达到相同的效果,我也真是服了。经过一番调查,总结了一下R语言中,箭头和等号的区别。
官方解释
引用R-manual里Assignment Operators对等号和箭头区别的一段解释。
There are three different assignment operators: two of them have leftwards and rightwards forms.
The operators
<-
and=
assign into the environment in which they are evaluated. The operator<-
can be used anywhere, whereas the operator=
is only allowed at the top level (e.g., in the complete expression typed at the command prompt) or as one of the subexpressions in a braced list of expressions.
赋值与传参
在大多数编程语言中,等号(=)的作用有两个:赋值和传参。等号(=)可以作为赋值变量的工具,也可在Function中发挥传递参数的作用。比如:
> a = 2 #变量赋值
> a
[1] 2
> read.table("fileName", header = TRUE) #传递参数
但箭头就不是这样了,它只有一个功能,赋值。假设所有的情况下,只用等号(=)。那么在作用域中,等号(=)就是赋值,在函数方程中设置参数时,就是传参。但是如果你在设置参数的时候使用了箭头(<-),那么你会发现在全局变量里,会多出一个和参数名相同的赋值的变量。会导致歧义和出错的可能,而且占用命名空间。比如:
> b <- 2 #变量赋值
> b
[1] 2
> read.table("fileName", header <- TRUE) #变量赋值
> header
[1] TRUE
但是箭头(<-)也不是一无是处。它有一个等号(=)不具备的能力:双向赋值。既然是箭头,那就一定有方向。在R语言中,箭头符号不但可以像等号一样向左赋值,而且向右也可以赋值。比如:
> b <- 2 #变量赋值
> b
[1] 2
> 3 -> a #变量赋值
> a
[1] 3
但是这个功能,通常是不用的,不利于代码的阅读和维护。只是箭头(<-)的确有这样一个功能。
优先级
当等号与箭头同时存在的时候,<-
的优先级=
要高于等号,例如连续赋值时
x = y = 5
x <- y <- 5
> x
[1] 5
> y
[1] 5
但如果混用,就会出现问题:
x <- y = 5 // Error in (x <- y) = 5 : object 'x' not found
x = y <- 5
> x
[1] 5
> y
[1] 5
原因是如果箭头和等号并行使用,箭头会先得到解析。
总结
今天详细的介绍了一下自己对R语言等号(=)和箭头(<-)的理解。至于怎样选择,看自己的习惯啦。