|
作為一門高級語言,R語言擁有獨特的語法,比如今天說道的賦值符號。在其他語言里,賦值符合通常用一個等號(=)表示,而在R語言里,承擔這個任務(wù)的可以是箭頭(<-)符號,也可以是等號(=)。這就導(dǎo)致許多R語言初學(xué)者,分不清R語言中的賦值到底是使用箭頭(<-)還是等號(=)?許多早期學(xué)習(xí)R的童鞋都比較喜歡使用等號(=)進行賦值。畢竟,簡簡單單的a = 5用起來比較符合大多數(shù)現(xiàn)有語言的習(xí)慣。出于對某種賦值方式的偏好,甚至出現(xiàn)了等號黨和箭頭黨,但是到底孰好孰壞,顯然爭不出任何結(jié)果,相對來說更重要的是了解這兩者的區(qū)別。只有我們深刻理解了其相同與不同之后,才能更好的運用他們。 R語言最開始設(shè)計的時候,是采用箭頭(<-)作為賦值符號的,這是從APL語言繼承而來的(箭頭表示賦值,等號表示判斷)。之后的S語言也沿用了這個用法,再之后R語言為了保持和S語言的兼容性保留了這個箭頭。直到2001年,R的更新版本中 才加入了等號(=)賦值。因此,對于一般的賦值語句,箭頭(<-)與 等號(=)在 功能上是沒有區(qū)別的,可以通用。但是等號(=)的作用有兩個:它既可以賦值,也可以傳遞函數(shù)參數(shù)(實際上傳參可以看作一種特殊形式的賦值,給參數(shù)賦值)。通常情況下,如果等號(=)出現(xiàn)在單獨的環(huán)境中,它就是賦值;如果寫在函數(shù)的參數(shù)位置,它就是傳參。如果你在設(shè)置參數(shù)的時候使用了箭頭(<-),那么你會發(fā)現(xiàn)在全局變量里,會多出一個和參數(shù)名相同的賦值的變量,容易導(dǎo)致歧義和錯誤,而且占用命名空間。 下面,我們通過幾個個例子來具體講一下這兩個函數(shù)的區(qū)別。
現(xiàn)在大家應(yīng)該清楚了解箭頭(<-)和等號(=)的區(qū)別了吧!個人建議,大家寫賦值語句時采用箭頭(<-),傳參時使用等號(=)。這也是大部分老師都會強烈推薦的用法。是因為使用箭頭(<-)賦值,意義清晰,可以保持代碼良好的可讀性,尤其是書寫復(fù)雜函數(shù)時,避免造成混亂。Google 的 R style guide(https://google./styleguide/Rguide.xml)也推薦使用箭頭(<-)賦值。 況且有些情況下,只能采用箭頭(<-)賦值,例如:system.time(c<-1:10)中就不能使用等號(=)。而從數(shù)學(xué)的角度來說,等號兩邊是相等的,即等號左邊的等于等號右邊的,等號右邊的也等于等號左邊的。等號本身并沒有指向性,因此并沒有辦法體現(xiàn)”賦值“這一含義。而在R中,箭頭(<-)符號生動的闡釋了賦值的含義,一個非等號(=)的賦值符從根本上向?qū)W習(xí)者暗示這樣一個真理: 賦值操作與數(shù)學(xué)上的等于是完全不同的。此外,箭頭(<-)符號可以雙向賦值,即x <- 10與10 -> x等價。習(xí)慣 <- 和 -> 的使用以后,也對后來習(xí)慣使用更為復(fù)雜的 <<- 以及 ->> 這兩個賦值符號(<<-或->>一般用于函數(shù)內(nèi)部,表示給上一層環(huán)境中的變量賦值)做好鋪墊,而 = 無法實現(xiàn)類似的功能。 另外也有等號黨提出異議,認為采用箭頭(<-)不如使用等號(=)。例如:如果我想判斷一個變量是否小于10,可以寫成 x<10;如果我想判斷一個變量是否小于-10,然后順手寫成x<-10,這時候就會產(chǎn)生歧義。關(guān)于處理負數(shù)時產(chǎn)生歧義的說法,只能說是沒有正確養(yǎng)成良好的空格習(xí)慣造成的,句號逗號后加空格,括號外圍加空格,運算符號兩邊加空格,這些應(yīng)該是學(xué)習(xí)代碼前就應(yīng)該懂得的常識。會犯出 a <- 5 和 a < -5 混淆的錯誤只能說明自己的代碼風(fēng)格糟糕,建議大家Google 的 R style guide(https://google./styleguide/Rguide.xml )中其他的一些代碼寫作規(guī)則。 Reference
|
|
|