2014-02-13 34 views
6

這裏是對R列表:如何部分更新或合併R中的列表?

list1 <- list(var1=1,var2=list(var21=1,var22=2,var23=list(var231=1,var232=0))) 

這裏是另一條R名單:

list2 <- list(var1=3,var2=list(var22=0,var23=list(var232=1,var233=2)),var3=list(var31=1)) 

現在我想通過list2更新list1,其中應包括更新現有的值,並引進新的價值。因此,應將var1,var22,var232更新爲list2中指定的值,var233,var3,var31應作爲新條目引入。因此更新列表應該是這樣的:

list(var1=3,var2=list(var21=1,var22=0,var23=list(var231=1,var232=2,var233=2)),var3=list(var31=1)) 

它與默認設置和用戶特定設置非常相似。應該根據用戶特定的設置加載和更新默認設置。在我的使用中,我只是從JSON文件(default.json)創建一個R列表作爲默認設置,並希望通過另一個JSON文件(user.json)產生的另一個列表來更新默認設置,就像許多程序一樣。

是否有現成的包裝或一些簡單/體面的方式來做到這一點?

+0

也許,[接合列表](http://stackoverflow.com/questions/21558459/joining-lists-in-r/21558546)是有用嗎? –

+0

解決方案'modifyList'可以工作,但是這個問題不應該被認爲與「在R中覆蓋具有相同名稱的值時合併列表」重複,因爲這裏不僅需要更新現有字段,而且需要更新內部列表中的字段比第一層內部清單被完全取代。 –

回答

9

有一個modifyList用於這些目的。請注意,我更正了list3定義,您的輸出中存在錯誤。

list4 <- modifyList(list1, list2) 
list3 <- list(var1=3,var2=list(var21=1,var22=0,var23=list(var231=1,var232=1,var233=2)),var3=list(var31=1)) 
all.equal(list3, list4) 
[1] TRUE 
+0

好吧,我猜想我改造了車輪。感謝您提供'modifyList'。 –

+0

+1,很好的一個知道。 – BrodieG

0

像這樣:

Rgames> list1 <- list(var1=1,var2=list(var21=1,var22=2,var23=list(var231=1,var232=0))) 
Rgames> list2 <- list(var1=3,var2=list(var22=0,var23=list(var232=1,var233=2)),var3=list(var31=1)) 
Rgames> matchname<-intersect(names(list1),names(list2)) 
Rgames> diffname<-setdiff(names(list2),names(list1)) 
Rgames> for (j in c(matchname,diffname)) list1[[j]]<-list2[[j]] 
Rgames> list1 
$var1 
[1] 3 

$var2 
$var2$var22 
[1] 0 

$var2$var23 
$var2$var23$var232 
[1] 1 

$var2$var23$var233 
[1] 2 



$var3 
$var3$var31 
[1] 1 

intersect發現在這兩個組的所有元素,這樣我可以在list1替換它們。 setdiff找到list2中的元素,而不是list1,所以我可以添加它們。事實上,你可以做for(j in names(list2)) list1[[j]] <- list2[j]],但是我擴展了它以展示你可以做些稍微不同的合併。