是否存在多值purrr :: pluck?

时间:2017-10-27 21:35:11

标签: r tidyverse purrr

似乎是一个基本问题,也许我只是遗漏了一些明显的东西......但有没有办法pluck子列表(purrr)? 更具体地说,这是一个初始列表:

l <- list(a = "foo", b = "bar", c = "baz")

我想返回一个只包含元素ab的新(子)列表。 通常情况下,我只是做'基'R子列表:

l[c("a", "b")]

但这并不能提供对.default的良好pluck处理。 我的理解是,pluck'替换'[[,但有purrr等效替换[

4 个答案:

答案 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