Creating a named list from two vectors (names, val

2020-02-17 08:59发布

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.

3条回答
▲ chillily
2楼-- · 2020-02-17 09:10

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!

查看更多
Root(大扎)
3楼-- · 2020-02-17 09:12

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.

查看更多
做自己的国王
4楼-- · 2020-02-17 09:19

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)

查看更多
登录 后发表回答