2013-08-29 49 views
0

我想添加一個新成員到列表中。當我這樣做時如下。但是,當我想要做一個函數,沒有什麼變化..如何將新成員添加到R中的函數列表中

> a = list(x=4, y=2) 
> a 
$x 
[1] 4 

$y 
[1] 2 

> a$c = 7 
> a 
$x 
[1] 4 

$y 
[1] 2 

$c 
[1] 7 

使用功能...

> addNew(a) 
> a 
$x 
[1] 4 

$y 
[1] 2 

功能是:

addNew = function(list){ 
    list$c = 7 
} 

也許是有點兒像c中的指針問題,但如何解決它?

回答

1

您必須返回並分配修改列表:

a <- list(x=4, y=2) 
addNew <- function(l) { 
    l$c <- 7 
    return(l) 
} 
a <- addNew(a) 

編輯:由於@mitra提到的,你可以使用<<-

a <- list(x=4, y=2) 
addNew <- function() { 
    a$c <<- 7 
} 

但是,改變R A功能的典型行爲大多數用戶並不認爲某個功能會帶來像改變全球環境的副作用。

請仔細閱讀帕特里克·伯恩斯R Inferno(第35頁):

如果你認爲你需要< < - ,再想一想。如果反思,你仍然認爲你 需要< < - ,再想一想。只有當你的老闆因爲對你的憤怒而變得紅潤 你應該暫時屈服於誘惑而不做任何事情。有 已提議(不超過半開玩笑),以消除< < - 從 語言。這不會消除全球任務,只會迫使您使用分配功能來實現它們。

+0

這是真的!但是還有其他方法可以做到嗎?我可能想要修改函數中的多個列表.. – ykpemre

+1

您可以返回列表的列表;)。 – sgibb

0

你應該看看局部和全局變量之間的差別:

Global and local variables in R

如果你定義一個函數內部的變量,它是暫時的,只屬於功能。

檢查:

list$c<<-7 
+0

我也嘗試過一個全局變量,它沒有改變。在R中定義全局變量有什麼特別的方法嗎? – ykpemre

+0

list $ c << - 7是作品。謝謝!但是你應該在全局中編寫實際的變量名稱,而不是通過參數名稱工作。 – ykpemre

+1

對不起,忘記了。 – mitra

相關問題