Обновить
Теперь, в 2020 году, форма ответа @mihagazvoda описывает правильный подход: просто set_names
перед применением map
c("a", "b", "c") %>%
purrr::set_names() %>%
purrr::map(~paste0('test-', .))
Устаревший ответ
Принятое решение работает, но страдает от повторяющегося аргумента (input
), который может вызывать ошибки и прерывать поток при использовании конвейера с %>%
.
Альтернативным решением было бы использование оператора %>%
с большей мощностью.
1:5 %>% { set_names(map(., ~ .x + 3), .) } %>% print # ... or something else
Это берет аргумент из трубы, но все же лишен красоты. Альтернативой может быть небольшой вспомогательный метод, такой как
map_named = function(x, ...) map(x, ...) %>% set_names(x)
1:5 %>% map_named(~ .x + 1)
Это уже выглядит красивее и элегантнее. И было бы моим предпочтительным решением.
Наконец, мы могли бы даже перезаписать purrr::map
в случае, если аргумент является символьным или целочисленным вектором, и в таком случае создать именованный список.
map = function(x, ...){
if (is.integer(x) | is.character(x)) {
purrr::map(x, ...) %>% set_names(x)
}else {
purrr::map(x, ...)
}
}
1 : 5 %>% map(~ .x + 1)
Однако оптимальным решением было бы, если purrr
реализовал бы такое поведение из коробки.
person
Holger Brandl
schedule
09.07.2019
base::Map
:output2 <- Map(function(x) {paste0("test-", x)}, input)
. - person andycraig   schedule 05.06.2018