base R中无需循环修改嵌套列表元素的方法
嵌套列表批量修改子元素实现方案
问题场景
- 待处理对象为顶层包含2个及以上元素的嵌套列表,需求为修改子列表内的命名元素:将与顶层列表等长的命名向量对应值,追加到每个子列表的指定位置。
- 示例输入定义:
L <- list( foo = list( x1=1, x2=c(a=1, b=2) ), bar = list( x1=2, x2=c(e=2, f=3) ) ) N <- c(n=11, n=12)
- 期望输出结果:
list( foo = list( x1=1, x2=c(a=1, b=2, n=11) ), bar = list( x1=2, x2=c(e=2, f=3, n=12) ) )
- 目前读取子列表
x2元素已有极简写法:
lapply(L, "[[", "x2")
需要找到同等简洁、无需编写显式循环的修改写法。
基础R最简实现
使用Map做按位置配对处理,写法和lapply读取风格统一,无显式循环,且自动保留原列表所有命名结构:
L <- Map(function(sub_lst, add_val) { sub_lst$x2 <- c(sub_lst$x2, add_val) sub_lst }, L, N)
若要完全使用内置运算符、不编写自定义函数逻辑,可调用替换函数[[<-实现:
L <- Map( function(lst, val) `[[<-`(lst, "x2", value = c(`[[`(lst, "x2"), val)), L, N )
两种写法运行后得到的结果和期望输出完全一致。
内容的提问来源于stack exchange,提问作者tpetzoldt
相关产品推荐
相关产品推荐

