Creating a named list from two vectors (names, values)

RListConstructorLapplyNamed

R Problem Overview


Is there a way to use mapply on two vectors to construct a named list? The first vector would be of type character and contain the names used for the list while the second contains the values.

So far, the only solution I have is:

> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`

$bar
`2`

This seems like a rather contrived solution, but I can't figure out how to do it otherwise. The problems I have with it are:

  1. It requires the creation of dummyList even though dummyList is never changed and is an empty list after the call to mapply.

  2. If the numeric vector, c(1, 2), is not converted to a list, then the result of the call to mapply is a named vector of doubles.

To get around problem 2, I can always just call mapply on two vectors and then call as.list on the result, but it seems like there should be a way to directly create a list with the values being in a vector.

R Solutions


Solution 1 - R

You can use setNames()

setNames(as.list(c(1, 2)), c("foo", "bar"))

(for a list) or

setNames(c(1, 2), c("foo", "bar"))

(for a vector)

Solution 2 - R

I share Ben's puzzlement about why you might want to do this, and his recommendation.

Just for curiosity's sake, there is a sort of "hidden" feature in mapply that will allow this:

x <- letters[1:2]
y <- 1:2
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE)
$a
[1] 1

$b
[1] 2

Noting that the documentation for USE.NAMES says:

> USE.NAMES logical; use names if the first ... argument has names, or > if it is a character vector, use that character vector as the names.

Solution 3 - R

What I propose is made in 2 steps, and it's quite straightforward, so maybe it's easier to understand:

test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")

What @ben-bolker proposes works, but just wanted to share an alternative, in case you prefer it.

Happy coding!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJon ClausView Question on Stackoverflow
Solution 1 - RBen BolkerView Answer on Stackoverflow
Solution 2 - RjoranView Answer on Stackoverflow
Solution 3 - RUnai SanchezView Answer on Stackoverflow