purrr 与 pluck 相对(丢弃元素)+ 在 pluck 中保留列表结构

Kim*_*Kim 5 indexing r purrr

假设有一个列表如下:

x <- list(a = list(a1 = 1, a2 = 2), b = list(a2 = 3, a1 = 4))
Run Code Online (Sandbox Code Playgroud)

位置/名称混合在子列表中,a1要从列表中取出s,我将在purrr.

x %>% map(purrr::pluck, "a1")
$`a`
[1] 1

$b
[1] 4
Run Code Online (Sandbox Code Playgroud)

为了扔掉一个元素而不是保留它,我进行了一些实验,并提出了以下内容(我在a2这里扔掉了)。

x %>% map(purrr::assign_in, "a2", value = NULL)
$`a`
$`a`$`a1`
[1] 1


$b
$b$`a1`
[1] 4
Run Code Online (Sandbox Code Playgroud)

在采摘方面,我实际上更喜欢第二种风格——也就是说,保持列表索引结构不变,同时只返回我想要的元素。所以我更希望一旦我执行x %>% map(purrr::pluck, "a1"),我就会得到第二个结果。

或者,也许有一种更好的方法来抛出purrr我不知道的对象,以便两个代码的输出样式(采摘,扔掉)保持一致?

akr*_*run 4

如果我们需要一致的方法,请使用keep

library(purrr)
map(x, ~ keep(.x, names(.x) == "a1"))
#$a
#$a$a1
#[1] 1


#$b
#$b$a1
#[1] 4
Run Code Online (Sandbox Code Playgroud)

discard

map(x, ~ discard(.x, names(.x) == "a1"))
#$a
#$a$a2
#[1] 2


#$b
#$b$a2
#[1] 3
Run Code Online (Sandbox Code Playgroud)