R中“ =”和“ <-”赋值运算符有什么区别?

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


#1楼

运算符<-=分配到对其进行评估的环境中。 运算符<-能够在任何地方使用, 而运算符=仅在顶级级别 (例如,在命令提示符下键入的完整表达式中)或做为括号列表中的子表达式之一才容许使用架构


#2楼

当您使用赋值运算符在函数调用中设置参数值时,它们之间的区别更加明显。 例如: 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帮助页面上所示。


#3楼

Google的R风格指南经过禁止分配“ =”来简化此问题。 不错的选择。

https://google.github.io/styleguide/Rguide.xml

R手册详细介绍了全部5个赋值运算符。

http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html


#4楼

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


#5楼

这也可能增长对这两个运算符之间区别的理解:

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

相关文章
相关标签/搜索