使用 purrr 修改嵌套列表的特定元素

问题描述 投票:0回答:1

我想修改嵌套列表的每个元素。但只是一个特定的子元素。在下面的示例中,我的目标是修改名为“data”的元素。

# dummy data
mylist <- list(
  item1 = list(label = "My first label", data = 1:10),
  item2 = list(label = "My second label", data = 10:20)
)

我可以使用嵌套在

modify_in()
中的
map()
来实现此目的,如下所示。 (例如来自这个问题)。

library(purrr)

map(mylist, \(l) modify_in(l, "data", \(dat) {append(dat, 99)})) # using `append` as an example

但我想知道是否有更简单的方法,也许使用

purrr
的其他功能?我的实际用例更复杂,如果可能的话我想避免嵌套迭代。

像这样的东西(不起作用)将是理想的

modify_in(mylist, list(seq_along(mylist), "data"), \(dat) append(dat, 99)) # doesn't work

查看其他

purrr
函数(例如
modify_depth()
)的文档没有给我任何答案,因此向你们求助。

r purrr
1个回答
0
投票

我们可以对每个列表元素

modify
(在您的情况下为
l
等)使用
item1
循环,并检查它是否有子元素
l[["data]]
,如果有的话,使用
append

嵌套循环不是必需的,但重要的是在更改

return
子元素后
data
整个列表元素。

library(purrr)

mylist <- list(
  item1 = list(label = "My first label", data = 1:10),
  item2 = list(label = "My second label", data = 10:20)
)

modify(mylist,
       .f = \(l) {
         if(!is.null(l[["data"]])) {
           l[["data"]] <- append(l[["data"]], 99)   
         }
         return(l)
         }
       )
#> $item1
#> $item1$label
#> [1] "My first label"
#> 
#> $item1$data
#>  [1]  1  2  3  4  5  6  7  8  9 10 99
#> 
#> 
#> $item2
#> $item2$label
#> [1] "My second label"
#> 
#> $item2$data
#>  [1] 10 11 12 13 14 15 16 17 18 19 20 99

创建于 2024-02-10,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.