如何在R中部分更新或合并列表?

时间:2014-02-13 13:22:24

标签: 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))

现在我想要list1更新list2,其中应包括更新现有值和引入新值。因此,var1var22var232应更新为list2var233var3,{{1}中指定的值应该作为新条目引入。因此,更新的列表应该是:

var31

与默认设置和用户特定设置非常相似。应通过用户特定设置加载和更新默认设置。在我的使用中,我只是从JSON文件(list(var1=3,var2=list(var21=1,var22=0,var23=list(var231=1,var232=2,var233=2)),var3=list(var31=1)) )创建一个R列表作为默认设置,并希望通过另一个JSON文件(default.json)生成的另一个列表更新默认设置,就像许多程序一样做。

是否有现成的套餐或一些简单/体面的方式来做到这一点?

2 个答案:

答案 0 :(得分:12)

出于这些目的,有一个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

答案 1 :(得分: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中替换它们。 setdifflist2而非list1中找到元素,因此我可以添加它们。实际上,您可以for(j in names(list2)) list1[[j]] <- list2[j]],但我将其展开以显示您可以进行稍微不同的合并。