web-dev-qa-db-fra.com

Création d'une liste nommée à partir de deux vecteurs (noms, valeurs)

Existe-t-il un moyen d'utiliser mapply sur deux vecteurs pour construire une liste nommée? Le premier vecteur serait de type character et contiendrait les noms utilisés pour la liste tandis que le second contiendrait les valeurs.

Jusqu'à présent, la seule solution que j'ai est:

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

$bar
`2`

Cela semble être une solution plutôt artificielle, mais je ne peux pas comprendre comment le faire autrement. Les problèmes que j'ai avec lui sont:

  1. Il nécessite la création de dummyList même si dummyList n'est jamais modifié et est une liste vide après l'appel à mapply.

  2. Si le vecteur numérique, c(1, 2), n'est pas converti en liste, le résultat de l'appel à mapply est un vecteur nommé de doubles.

Pour contourner le problème 2, je peux toujours simplement appeler mapply sur deux vecteurs puis appeler as.list Sur le résultat, mais il semble qu'il devrait y avoir un moyen de créer directement une liste avec les valeurs être dans un vecteur.

38
Jon Claus

Vous pouvez utiliser setNames()

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

(pour une liste) ou

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

(pour un vecteur)

75
Ben Bolker

Je partage la perplexité de Ben sur la raison pour laquelle vous pourriez vouloir faire cela, et sa recommandation.

Juste pour la curiosité, il y a une sorte de fonctionnalité "cachée" dans mapply qui permettra ceci:

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

Notant que la documentation de USE.NAMES dit:

USE.NAMES logique; utilisez des noms si le premier argument ... a des noms, ou s'il s'agit d'un vecteur de caractères, utilisez ce vecteur de caractères comme noms.

9
joran