似乎是一个基本问题,也许我只是遗漏了一些明显的东西......但有没有办法pluck
子列表(purrr
)?
更具体地说,这是一个初始列表:
l <- list(a = "foo", b = "bar", c = "baz")
我想返回一个只包含元素a
和b
的新(子)列表。
通常情况下,我只是做'基'R子列表:
l[c("a", "b")]
但这并不能提供对.default
的良好pluck
处理。
我的理解是,pluck'替换'[[
,但有purrr
等效替换[
?
答案 0 :(得分:0)
我认为purrr::keep()
做你想做的事。
l %>% keep(names(.) == "a" | names(.) == "b")
答案 1 :(得分:0)
显然需要&#34; muti-value pluck&#34;。它真正归结为扩大&#34;采取&#34;的灵活性。从this github问题中描述的同一级别的列表中检索多个值。对于上面的示例,您可能可以逃脱:
> purrr::map(purrr::set_names(c("a", "b")),
~purrr::pluck(l, .x, .default = NA_character_))
#> $a
#> [1] "foo"
#>
#> $b
#> [1] "bar"
答案 2 :(得分:0)
类似于jzadra的帖子,您也可以这样做:
l %>% keep(names(.) %in% c("a","b"))
答案 3 :(得分:0)
这是我的看法。并非基于purrr
,因此主题稍有偏离,但与tidyverse
的与管道完美搭配的一般接口原理兼容。
pluck_multiple <- function(x, ...) {
`[`(x, ...)
}
x <- list(a = 1, b = 2, c = list(x = TRUE, y = FALSE))
pluck_multiple(x, c("a", "b"))
#> $a
#> [1] 1
#>
#> $b
#> [1] 2
pluck_multiple(x, 2:3)
#> $b
#> [1] 2
#>
#> $c
#> $c$x
#> [1] TRUE
#>
#> $c$y
#> [1] FALSE