在R中赋值运算符=和<-之间有什么区别?

我知道操作符略有不同,如本例所示

x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"

但这是唯一的不同吗?


当前回答

这也有助于理解这两个操作符之间的区别:

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

其他回答

谷歌的R样式指南通过禁止赋值使用“=”简化了这个问题。不错的选择。

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

R手册详细介绍了所有5个赋值操作符。

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

来自官方R文档:

操作符<-和=赋值到它们所处的环境 进行了评估。操作符<-可以在任何地方使用,而 操作符=只允许在顶层(例如,在 在命令提示符处键入的完整表达式)或作为 带括号的表达式列表中的子表达式。

这也有助于理解这两个操作符之间的区别:

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

在R的过去版本甚至R的前身语言(S语言)中,<-和=之间存在一些差异。但目前,像使用其他现代语言(python, java)一样使用=似乎不会引起任何问题。你可以通过使用<-来实现更多的功能,当传递一个值给一些增强,同时也创建一个全局变量,但它可能会有奇怪的/不想要的行为,如in

df <- data.frame(
      a = rnorm(10),
      b <- rnorm(10)
)
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 ...

强烈推荐!试着阅读这篇文章,这是试图解释这两者区别的最好的文章: 检查https://colinfay.me/r-assignment/

此外,可以将<-看作一个无形地返回一个值的函数。

a <- 2
(a <- 2)
#> [1] 2

参见:https://adv-r.hadley.nz/functions.html

我不确定Patrick Burns的书R inferno是否在8.2.26中被引用,其中=不是<的同义词- Patrick说“当你想设置一个函数的参数时,你显然不想使用'<-'。”这本书可以在https://www.burns-stat.com/documents/books/the-r-inferno/上买到