这是一个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
,其中应包括更新现有值和引入新值。因此,var1
,var22
,var232
应更新为list2
和var233
,var3
,{{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
)生成的另一个列表更新默认设置,就像许多程序一样做。
是否有现成的套餐或一些简单/体面的方式来做到这一点?
答案 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
中替换它们。 setdiff
在list2
而非list1
中找到元素,因此我可以添加它们。实际上,您可以for(j in names(list2)) list1[[j]] <- list2[j]]
,但我将其展开以显示您可以进行稍微不同的合并。