2016-07-22 26 views
0

您好運行以下幾行,有點驚訝。混亂在線:與範圍界定/參數傳遞混淆R

好了,所以我創建了一個清單:

> x<-list() 

分配1是由 「A」

> x$a<-1 

我問看什麼是X索引的元素

> x 
$a 
[1] 1 

yup so far so so well

接下來我宣佈一個函數,將傳遞給它,並像分配索引列表「一」我只是分配給指數「b」值2

> foo<-function(xx) { 
+ xx["b"]<-2 
+ print(xx) 
+ } 

我調用該函數與X - 我喜歡我所看到 現在,我的想法是,列表對象得以通過(通過引用在C,當你做& x)和它破壞性修改

> foo(x) 
$a 
[1] 1 

$b 
[1] 2 

現在我打印X功能的體外 - 但很驚訝,看不到b

> x 
$a 
[1] 1 

> 

我讀取舀和參數傳遞文檔,但無法弄清楚這一點。在調用函數體之前列表是深度還是淺度複製?

+2

你需要'assign'或'x <-foo(x)' – akrun

+0

,所以你說我需要返回修改後的列表並重新分配它。這不會是一個優雅的解決方案,因爲我正在寫圖形漫步者......讓我看看分配。再次感謝 – user975917

+2

'現在我的想法是列表對象被傳遞(通過引用如C)'。我第一次聽到C通過引用傳遞。順便說一句,R是一種*功能*編程語言。函數的參數被複制,它們的修改不會被保留在函數範圍之外。 – nicola

回答

1

This question討論的r副本上修改更詳細機制;哈德利對函數here的解釋包含一個非常類似於你的例子(查看「返回值」部分)。簡要概述是從概念上(並且從用戶的角度出於所有實際目的),R 總是通過值傳遞參數。在幕後,解釋者可以避免這種情況,只要它能推斷出這樣做是安全的,但應用程序員不能也不應該做出任何假設。