Combine/merge lists by elements names

An update of flodel's answer for tidyverse users:

list1 <- list(integers=c(1:7), letters=letters[1:5],
               words=c("two", "strings"))
list2 <- list(letters=letters[1:10], booleans=c(TRUE, TRUE, FALSE, TRUE),
               words=c("another", "two"), floats=c(1.2, 2.4, 3.8, 5.6))

input_list <- list(list1, list2, list1, list2)

We want to replicate the original desired output exactly twice for each element in the output list. Using map2 and reduce, we can achieve that with a little bit more clarity than the base R solution involving do.call, mapply, and lapply. First, we declare a function that combines two lists by their named elements using c(), then we call our function on the input list via reduce:

library(purrr)

cat_lists <- function(list1, list2) {  

  keys <- unique(c(names(list1), names(list2)))
  map2(list1[keys], list2[keys], c) %>% 
    set_names(keys)  

}

combined_output <- reduce(input_list, cat_lists)

Which gives us what we want:

> combined_output

#> $integers
#>  [1] 1 2 3 4 5 6 7 1 2 3 4 5 6 7
#> 
#> $letters
#>  [1] "a" "b" "c" "d" "e" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "a" "b"
#> [18] "c" "d" "e" "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
#> 
#> $words
#> [1] "two"     "strings" "another" "two"     "two"     "strings" "another"
#> [8] "two"    
#> 
#> $booleans
#> [1]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
#> 
#> $floats
#> [1] 1.2 2.4 3.8 5.6 1.2 2.4 3.8 5.6

You can do:

keys <- unique(c(names(lst1), names(lst2)))
setNames(mapply(c, lst1[keys], lst2[keys]), keys)

Generalization to any number of lists would require a mix of do.call and lapply:

l <- list(lst1, lst2, lst1)
keys <- unique(unlist(lapply(l, names)))
setNames(do.call(mapply, c(FUN=c, lapply(l, `[`, keys))), keys)