2012-06-08 34 views
6

The manual狀態:爲什麼不應該在函數中使用「=」R運算符?

運算符「< - 」可用於任何地方, 而運算符「=」僅被允許在頂部電平(例如, 在命令提示輸入的完整表達式)或者作爲表達式的支撐列表中的子表達式的一個 。

The question here提到在函數調用中使用的區別。但是在功能定義,它似乎正常工作:那麼,爲什麼手冊中提到,the operator ‘=’ is only allowed at the top level

a = function() 
{ 
    b = 2 
    x <- 3 
    y <<- 4 
} 

a() 
# (b and x are undefined here) 

沒有任何關於它的language definition(沒有=運營商上市,真可惜!)未在頂層

+0

它在[第10.4.2節中綴和前綴運算符]中的R-lang中提及(http://cran.r-project.org/doc/manuals/R-lang.html#Infix-and-prefix-operators ),但並沒有提到比你提到的幫助條目更多的內容。 –

+5

您引用的文字是「在頂級**或**在子表達式的支撐列表中」。你在一個子表達式的支撐列表中使用它。哪個是允許的。 – Andrie

+5

你必須竭盡全力去尋找既不是頂層也不在大括號內的表達式。這是一個。你有時想把一個賦值包裝在try塊中:try(x < - f())'很好,但是try(x = f(x))不是 - 你需要改變賦值運算符或添加大括號。 –

回答

12

你引用的文字,說at the top level OR in a braced list of subexpressions。你在一個子表達式的支撐列表中使用它。哪個是允許的。

你必須竭盡全力去尋找既不是頂層也不在括號內的表達式。這是一個。你有時想在一個try塊中包裝一個賦值:try(x <- f())沒問題,但try(x = f(x))不是 - 你需要改變賦值運算符或者添加大括號。

+0

Vincent,謝謝,但是這個答案是怎麼回事我的例子中有關'b = 2'錯誤的問題?也許我想念一些東西,然後請以更明顯的方式解釋:) – TMS

+0

@Tomas我添加了我的評論,您發現有幫助。我認爲這回答了這個問題。 – Andrie

+0

謝謝安德烈,太棒了! – TMS

3

除了一些例子,如system.time,其他人已經顯示<-=有不同的結果,主要區別更具哲理性。 Perl的創造者拉里沃爾說,「類似的東西應該看起來相似,不同的東西看起來不一樣」,我發現在不同的語言中有趣的是看到什麼被認爲是「相似的」,哪些被認爲是「不同」。現在對R分配讓我們比較兩個命令:

myfun(a <- 1:10) 

myfun(a = 1:10) 

有人會說,在這兩種情況下,我們分配到1:10所以a我們正在做的是類似的。

的另一種說法是,在第一呼叫,我們賦值給一個變量a即從中myfun被調用並且在第二呼叫,我們賦值給一個變量a是在創建的環境相同的環境當函數被調用並且是函數的局部時,這兩個變量是不同的。

所以使用哪一個取決於您是否將分配考慮爲「相似」或「不同」。

個人而言,我更喜歡<-,但我認爲這不值得打一場神聖的戰爭。

相關問題