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:
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
.
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.
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)
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.