purrr противоположность pluck (выбросить элемент) + сохранение структуры списка в pluck - PullRequest
2 голосов
/ 05 мая 2019

Предположим, есть следующий список:

x <- list(a = list(a1 = 1, a2 = 2), b = list(a2 = 3, a1 = 4))

Позиции / имена смешаны в подсписках, и чтобы вычеркнуть a1 s из списка, я бы сделал следующее в purrr.

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

$b
[1] 4

Чтобы выбросить элемент вместо того, чтобы хранить его, я немного поэкспериментировал и придумал следующее (я выбросил a2 здесь).

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


$b
$b$`a1`
[1] 4

С точки зрения выщипывания, мне на самом деле нравится второй стиль - то есть сохранять структуру индексации списка без изменений, возвращая только те элементы, которые мне нужны. Поэтому я бы предпочел, чтобы, выполнив x %>% map(purrr::pluck, "a1"), я получил второй результат.

В качестве альтернативы, может быть, есть лучший способ выброса объектов в purrr, о котором я не знаю, чтобы стили вывода двух кодов (выщипывание, выбрасывание) были согласованы?

Ответы [ 2 ]

2 голосов
/ 05 мая 2019

Если нам нужен последовательный подход, используйте keep

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


#$b
#$b$a1
#[1] 4

и discard

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


#$b
#$b$a2
#[1] 3
0 голосов
/ 05 мая 2019

Вот еще один способ использования modify_at и предложение более идиоматического способа сделать ваш первый вызов:

library(purrr)
#> Warning: package 'purrr' was built under R version 3.5.3
x <- list(a = list(a1 = 1, a2 = 2), b = list(a2 = 3, a1 = 4))

# rather than x %>% map(purrr::pluck, "a1")
x %>% map("a1")
#> $a
#> [1] 1
#> 
#> $b
#> [1] 4
x %>% modify(modify_at,"a2", ~NULL)
#> $a
#> $a$a1
#> [1] 1
#> 
#> 
#> $b
#> $b$a1
#> [1] 4

Создано в 2019-05-05 пакетом представ. (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...