我在理解R的語義和語法方面遇到了很多麻煩。在我看來,局部變量不能在函數內部修改。R中的函數內部可以修改非全局變量嗎?
舉個例子,在這個基本的代碼,我希望當我打電話了foo()
功能heatmap.matrix
變量得到更新。
heatmap.matrix <- matrix(rep(0,40000), nrow=200, ncol=200)
# foo function should just update a single cell of the declared matrix
foo <- function() { heatmap.matrix[40,40] <- 100}
heatmap.matrix[40,40]
[1] 0
foo()
heatmap.matrix[40,40]
[1] 0
# there I expected it to return 100. Yet if I do it out of the function:
heatmap.matrix[40,40] <- 100
[1] 100
這使我相信,變量的範圍不傳回的函數計算後。 這是R的情況嗎?還有其他事情嗎?我覺得我真的不知道發生了什麼。任何幫助/見解將真正被讚賞!
爲了快速說明,在我的代碼中,我有一個包含x
和y
列的頻率表,我試圖將其轉換爲一個2-D矩陣,其值對應於頻率表中的條目,如果沒有相應的條目,則爲零。但是,我無法在應用函數中修改我的矩陣。
雙賦值運算符'<< - '用於修改函數外部的變量。另外,請閱讀[函數](http://adv-r.had.co.nz/Functions.html)和詞彙範圍 – SymbolixAU
'foo()'獲取'heatmap.matrix'的一個副本,並在裏面修改它功能。全局'heatmap.matrix'永遠不會被修改。通常,R需要一個對象的副本,進行修改,然後返回整個對象,如'foo < - function(){heatmap.matrix [40,40] < - 100; heatmap.matrix}' – thelatemail
你可以使用'<< - '在本地環境之外進行分配,但它通常是不好的形式。最好是返回改變後的對象,所以從代碼中可以清楚地看到,你正在重新分配變量,並且沒有任何東西會被無形地改變。 '<< - '也是有點危險的,因爲根據你的結構和變量名稱(以及其他父級環境中的名稱),它可能不會指定你想要的位置,這可能會給你帶來bug,或者更糟糕的是,誰沒有源代碼。 – alistaire