Создание именованного списка из двух векторов (имена, значения)

Есть ли способ использовать mapply на двух векторах для создания именованного списка? Первый вектор будет иметь тип character и содержать имена, используемые для списка, а второй - значения.

Пока единственное решение, которое у меня есть:

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

$bar
`2`

Это похоже на довольно надуманное решение, но я не могу понять, как это сделать в противном случае. У меня есть проблемы:

  • Требуется создание dummyList, хотя dummyList никогда не изменяется и является пустым списком после вызова mapply.

  • Если числовой вектор c(1, 2) не преобразуется в список, тогда результат вызова mapply является именованным вектором удвоений.

Чтобы обойти проблему 2, я всегда могу просто вызвать mapply на двух векторах, а затем вызывать as.list в результате, но кажется, что должен быть способ прямого создания списка со значениями, находящимися в вектор.

Ответ 1

Вы можете использовать setNames()

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

(для списка) или

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

(для вектора)

Ответ 2

Я разделяю мнение Бена о том, почему вы, возможно, захотите это сделать, и его рекомендации.

Просто ради любопытства в mapply есть своего рода "скрытая" функция, которая позволит это:

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

Отмечая, что в документации для USE.NAMES указано:

USE.NAMES логический; использовать имена, если первый аргумент... имеет имена или если он является символьным вектором, используйте этот символьный вектор в качестве имен.