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

后端 未结 3 1289
暗喜
暗喜 2020-12-29 22:28

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 be

相关标签:
3条回答
  • 2020-12-29 23:19

    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)
    
    0 讨论(0)
  • 2020-12-29 23:21

    Update

    Now in 2020 the answer form @mihagazvoda describes the correct approach: simply set_names before applying map

    c("a", "b", "c") %>% 
        purrr::set_names() %>% 
        purrr::map(~paste0('test-', .))
    

    Outdated answer

    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.

    0 讨论(0)
  • 2020-12-29 23:24

    The recommended solution:

    c("a", "b", "c") %>% 
        purrr::set_names() %>% 
        purrr::map(~paste0('test-', .))
    
    0 讨论(0)
提交回复
热议问题