是否存在多值purrr :: pluck?

mmu*_*urr 7 r purrr tidyverse

似乎是一个基本问题,也许我只是缺少一些明显的问题……但是有什么办法可以pluck使子列表(带有purrr)?更具体地说,这是一个初始列表:

l <- list(a = "foo", b = "bar", c = "baz")
Run Code Online (Sandbox Code Playgroud)

我想返回仅包含元素a和的新(子)列表b。通常,我只做“基础” R子列表:

l[c("a", "b")]
Run Code Online (Sandbox Code Playgroud)

但这不能很好地.default处理pluck。我的理解是采摘可以“替代” [[,但是有purrr替代替代品[吗?

Rap*_*ter 7

这是我的看法。不是基于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
Run Code Online (Sandbox Code Playgroud)


小智 5

类似于 jzadra 的帖子,你也可以这样做:

l %>% keep(names(.) %in% c("a","b"))
Run Code Online (Sandbox Code Playgroud)


jza*_*dra 2

我认为这purrr::keep()就是你想要的。

l %>% keep(names(.) == "a" | names(.) == "b")