R中赋值运算符=
和<-
之间有什么区别? html
我知道运算符略有不一样,如本例所示 git
x <- y <- 5 x = y = 5 x = y <- 5 x <- y = 5 # Error in (x <- y) = 5 : could not find function "<-<-"
但这是惟一的区别吗? github
运算符<-
和=
分配到对其进行评估的环境中。 运算符<-
能够在任何地方使用, 而运算符=
仅在顶级级别 (例如,在命令提示符下键入的完整表达式中)或做为括号列表中的子表达式之一才容许使用 。 架构
当您使用赋值运算符在函数调用中设置参数值时,它们之间的区别更加明显。 例如: less
median(x = 1:10) x ## Error: object 'x' not found
在这种状况下, x
在函数范围内声明,所以它在用户工做空间中不存在。 ide
median(x <- 1:10) x ## [1] 1 2 3 4 5 6 7 8 9 10
在这种状况下, x
在用户工做空间中声明,所以您能够在函数调用完成后使用它。 函数
在R社区中,一般优先使用<-
进行赋值(功能签名中除外),以与(很是)旧版本的S-Plus兼容。 请注意,空格有助于澄清相似状况 ui
x<-3 # Does this mean assignment? x <- 3 # Or less than? x < -3
大多数R IDE都具备键盘快捷键,以使<-
易于键入。 CTRL + =在架构师,Alt + -在RStudio( 选项 + -在MacOS),Shift + -在emacs的+ ESS(下划线)。 this
若是您喜欢将=
编写为<-
但想对公开发布的代码使用更常见的赋值符号(例如,在CRAN上),则可使用formatR
包中的tidy_*
函数之一,将=
自动替换=
<-
。 google
library(formatR) tidy_source(text = "x=1:5", arrow = TRUE) ## x <- 1:5
问题“为何x <- y = 5
而不是x <- y <- 5
x <- y = 5
引起错误?”的答案 是“取决于解析器中包含的魔术”。 R的语法包含许多模棱两可的状况 ,必须以一种或另外一种方式解决。 解析器根据是否使用=
或<-
选择以不一样顺序解析表达式的位。
要了解正在发生的事情,您须要知道赋值以静默方式返回已分配的值。 经过显式打印,例如print(x <- 2 + 3)
,您能够更清楚地看到这一点。
其次,若是咱们使用前缀符号进行赋值,则更加清楚。 因此
x <- 5 `<-`(x, 5) #same thing y = 5 `=`(y, 5) #also the same thing
解析器将x <- y <- 5
为
`<-`(x, `<-`(y, 5))
咱们可能指望x <- y = 5
将是
`<-`(x, `=`(y, 5))
但实际上它被解释为
`=`(`<-`(x, y), 5)
这是由于=
的优先级低于<-
,如?Syntax
帮助页面上所示。
Google的R风格指南经过禁止分配“ =”来简化此问题。 不错的选择。
https://google.github.io/styleguide/Rguide.xml
R手册详细介绍了全部5个赋值运算符。
http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html
x = y = 5
等效于x = (y = 5)
,由于赋值运算符从右到左“分组”是可行的。 含义:为y
分配5,保留数字5; 而后将5分配给x
。
这与(x = y) = 5
,这不起做用! 含义:将y
的值分配给x
,剩下y
的值; 而后将5分配给嗯...究竟是什么?
当您混合使用不一样类型的赋值运算符时, <-
绑定比=
更紧密。 所以x = y <- 5
解释为x = (y <- 5)
,这是有意义的状况。
不幸的是, x <- y = 5
被解释为(x <- y) = 5
,这是行不通的!
有关优先级(绑定)和分组规则,请参见?Syntax
和?assignOps
。
这也可能增长对这两个运算符之间区别的理解:
df <- data.frame( a = rnorm(10), b <- rnorm(10) )
R为第一个元素分配了值和专有名称,而第二个元素的名称看起来有些奇怪。
str(df) # 'data.frame': 10 obs. of 2 variables: # $ a : num 0.6393 1.125 -1.2514 0.0729 -1.3292 ... # $ b....rnorm.10.: num 0.2485 0.0391 -1.6532 -0.3366 1.1951 ...
R版本3.3.2(2016-10-31); macOS Sierra 10.12.1