Это вопрос, для которого я уже писал в моем коде ошибки, но мне интересно, есть ли что-то более простое, что я пропустил.
Иногда у меня есть 2 (или более) списка, которые содержат информацию разных типов, которая должна работать вместе с такой функцией, как map2
- продумайте именованный список ggplot
объектов и именованный список путей к файлам для сохранения. выход каждого. Есть ли способ встроенного или легко добавляемого в рабочий процесс, чтобы убедиться, что элементы списка сопоставляются по имени, а не по позиции?
Рассмотрим простой пример:
library(purrr)
evens <- list(a = 2, b = 4, c = 6, d = 8)
odds <- list(a = 11, d = 9, c = 7, b = 5)
map2
возвращает список с теми же именами, что и список first , и выполняет итерацию по позиции. Поэтому тот факт, что элементы b
и d
включены в odds
, не рассматривается, и эти два вызова дают разные результаты:
map2(evens, odds, function(l1, l2) {
paste(l1, l2)
})
#> $a
#> [1] "2 11"
#>
#> $b
#> [1] "4 9"
#>
#> $c
#> [1] "6 7"
#>
#> $d
#> [1] "8 5"
map2(odds, evens, function(l1, l2) {
paste(l1, l2)
})
#> $a
#> [1] "11 2"
#>
#> $d
#> [1] "9 4"
#>
#> $c
#> [1] "7 6"
#>
#> $b
#> [1] "5 8"
В прошлом я вместо этого использовал imap
и использовал имена первого списка для извлечения соответствующего элемента из другого списка, но это означает, что у меня больше нет второго списка в аргументах моей функции:
imap(evens, function(l1, name) {
paste(l1, odds[[name]])
})
#> $a
#> [1] "2 11"
#>
#> $b
#> [1] "4 5"
#>
#> $c
#> [1] "6 7"
#>
#> $d
#> [1] "8 9"
Если я хочу почувствовать, что я работаю более равномерно в обоих списках, я мог бы упорядочить их по именам, но это кажется неуклюжим:
map2(
evens[order(names(evens))],
odds[order(names(odds))],
function(l1, l2) paste(l1, l2)
)
# same output as previous
Или еще более грубый, составьте список из двух списков, упорядочите их каждый в другой map
, затем перенаправьте его в pmap
, так как он принимает список списков:
list(evens, odds) %>%
map(~.[order(names(.))]) %>%
pmap(function(l1, l2) paste(l1, l2))
# same output as previous
В идеале я бы хотел совместить безопасность опции imap
с чистотой map2
.