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:
It requires the creation of
dummyList
even thoughdummyList
is never changed and is an empty list after the call tomapply
.If the numeric vector,
c(1, 2)
, is not converted to a list, then the result of the call tomapply
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.
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)
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.
来源:https://stackoverflow.com/questions/17842705/creating-a-named-list-from-two-vectors-names-values