在R中赋值运算符=和<-之间有什么区别?
我知道操作符略有不同,如本例所示
x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"
但这是唯一的不同吗?
在R中赋值运算符=和<-之间有什么区别?
我知道操作符略有不同,如本例所示
x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"
但这是唯一的不同吗?
当前回答
我不确定Patrick Burns的书R inferno是否在8.2.26中被引用,其中=不是<的同义词- Patrick说“当你想设置一个函数的参数时,你显然不想使用'<-'。”这本书可以在https://www.burns-stat.com/documents/books/the-r-inferno/上买到
其他回答
根据John Chambers的说法,操作符=只允许在“顶层”,这意味着它不允许在像if这样的控制结构中,这使得下面的编程错误是非法的。
> if(x = 0) 1 else x
Error: syntax error
正如他所写的,“在控制表达式中禁止新的赋值形式[=]可以避免编程错误(如上面的例子),与其他S赋值相比,相等操作符更有可能出现这种错误。”
如果它“通过大括号或一对额外的圆括号与周围的逻辑结构隔离”,则可以做到这一点,因此if ((x = 0)) 1否则x就可以工作。
参见http://developer.r-project.org/equalAssign.html
X = y = 5等价于X = (y = 5),因为赋值操作符从右向左“分组”,这是可行的。含义:将5赋给y,保留数字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
我不确定Patrick Burns的书R inferno是否在8.2.26中被引用,其中=不是<的同义词- Patrick说“当你想设置一个函数的参数时,你显然不想使用'<-'。”这本书可以在https://www.burns-stat.com/documents/books/the-r-inferno/上买到
谷歌的R样式指南通过禁止赋值使用“=”简化了这个问题。不错的选择。
https://google.github.io/styleguide/Rguide.xml
R手册详细介绍了所有5个赋值操作符。
http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html