我想修改嵌套列表的每个元素。但只是一个特定的子元素。在下面的示例中,我的目标是修改名为“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()
)的文档没有给我任何答案,因此向你们求助。
我们可以对每个列表元素
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