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