Use input of purrr's map function to create a named list as output in R

三世轮回 提交于 2019-12-04 09:07:17

问题


I am using the map function of the purrr package in R which gives as output a list. Now I would like the output to be a named list based on the input. An example is given below.

input <- c("a", "b", "c")
output <- purrr::map(input, function(x) {paste0("test-", x)})

From this I would like to access elements of the list using:

output$a

Or

output$b

回答1:


We just need to name the list

names(output) <- input

and then extract the elements based on the name

output$a
#[1] "test-a"

If this needs to be done using tidyverse

library(tidyverse)
output <- map(input, ~paste0('test-', .)) %>% 
                                setNames(input)



回答2:


The accepted solution works, but suffers from a repeated argument (input) which may cause errors and interrupts the flow when using piping with %>%.

An alternative solution would be to use a bit more power of the %>% operator

1:5 %>% { set_names(map(., ~ .x + 3), .) } %>% print # ... or something else

This takes the argument from the pipe but still lacks some beauty. An alternative could be a small helper method such as

map_named = function(x, ...) map(x, ...) %>% set_names(x)

1:5 %>% map_named(~ .x + 1)

This already looks more pretty and elegant. And would be my preferred solution.

Finally, we could even overwrite purrr::map in case the argument is a character or integer vector and produce a named list in such a case.

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)

However, the optimal solution would be if purrr would implement such behaviour out of the box.



来源:https://stackoverflow.com/questions/43935160/use-input-of-purrrs-map-function-to-create-a-named-list-as-output-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!