假设有一个列表如下:
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我不知道的对象,以便两个代码的输出样式(采摘,扔掉)保持一致?
如果我们需要一致的方法,请使用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)