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 though dummyList
is never changed and is an empty list after the call to mapply
.
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.
The list can be created using list() function in R. Named list is also created with the same function by specifying the names of the elements to access them. Named list can also be created using names() function to specify the names of elements after defining the list.
In order to convert a vector to a list, R provides us with unlist() function that converts the list into a vector in R. The unlist() function dissolves the list structure fed to it as arguments i.e. it converts the multi-dimensional schema into a a single dimensional schema.
The list() function in R is used to create a list of elements of different types. A list can contain numeric, string, or vector elements.
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)
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!
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With