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

相關文章
相關標籤/搜索