如何将R中的列表与部分不同的键合并?

时间:2014-03-27 13:26:58

标签: r list merge

这应该很容易,但我发现的所有例子都有不同的目标。

我得到了清单:

lst1 = list(
  Plot      = TRUE,  
  Constrain = c(1:10),
  Box       = "plot" 
)

lst2 = list(
  Plot      = FALSE,
  Lib       = "custom"
)

存储应该覆盖默认值的默认参数(lst1)和自定义参数(lst2)。我想要结果:

>lst
  $Plot
  [1] FALSE

  $Constrain
  [1]  1  2  3  4  5  6  7  8  9 10

  $Box
  [1] "plot"

  $Lib
  [1] "custom"

所以:

  • lst1中存在的lst2参数将覆盖值
  • 将保留lst2中不存在的lst1参数
  • 将添加lst1中不存在的lst2参数

对不起,我无法弄明白。我试过merge(),但是:

lst=merge(lst2,lst1)

给出

[1] Plot      Lib       Constrain Box      
<0 Zeilen> (oder row.names mit Länge 0)

- 编辑 - Fabians建议的解决方案正是我所需要的。甚至更多:它处理嵌套列表,例如

ParametersDefault = list(  
  Plot      = list(
    Surface = TRUE,
    PlanView= TRUE
  ),  
  Constrain = c(1:10),
  Box       = "plot" 
)

Parameters = list(
  Plot      = list(
    Surface = FALSE,
    Env     = TRUE
  ),
  Lib       = "custom"
)
Parameters = modifyList(ParametersDefault,Parameters)

print(Parameters$Plot$Surface)
# [1] FALSE

非常感谢!

2 个答案:

答案 0 :(得分:12)

lst1 = list(
    Plot      = TRUE,  
    Constrain = c(1:10),
    Box       = "plot" 
)

lst2 = list(
    Plot      = FALSE,
    Lib       = "custom"
)

modifyList(lst1, lst2)
# $Plot
# [1] FALSE
# 
# $Constrain
# [1]  1  2  3  4  5  6  7  8  9 10
# 
# $Box
# [1] "plot"
# 
# $Lib
# [1] "custom"

答案 1 :(得分:4)

您可以尝试:

> c(lst2, lst1[setdiff(names(lst1), names(lst2))])
$Plot
[1] FALSE

$Lib
[1] "custom"

$Constrain
 [1]  1  2  3  4  5  6  7  8  9 10

$Box
[1] "plot"