2009-07-09 6 views
46

J'ai deux variables, key et value, et je veux les ajouter comme une paire clé/valeur à une liste:Comment ajouter une paire clé/valeur variable à un objet de liste?

key = "width" 
value = 32 

mylist = list() 
mylist$key = value 

Le résultat est le suivant:

mylist 
# $key 
# [1] 32 

Mais je voudrais ceci à la place:

mylist 
# $width 
# [1] 32 

Comment est-ce que je peux faire ceci?

Répondre

57

Les listes R peuvent être considérées comme des hashes - vecteurs d'objets auxquels on peut accéder par leur nom. En utilisant cette approche, vous pouvez ajouter une nouvelle entrée à la liste comme ceci:

key <- "width" 
value <- 32 

mylist <- list() 
mylist[[ key ]] <- value 

Ici, nous utilisons la chaîne stockée dans la variable clé pour accéder à une position dans la liste revient à utiliser la valeur stockée dans une variable de boucle i pour accéder à un vecteur par:

vector[ i ] 

Le résultat est:

myList 
$width 
[1] 32 
+2

Merci! Je ne comprends pas encore vraiment cet opérateur d'indexation. Bien qu'il soit expliqué ici: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, l'utilisation que vous avez montrée n'est pas décrite. Existe-t-il un document en ligne où cela est décrit correctement? – Frank

+0

Si les valeurs sont des types de base (par exemple, numérique simple, caractère, etc.), vous pouvez utiliser un tableau régulier tel que: x <- c (1, 4, 2, 5). Puis attribuez des noms à chaque valeur d'index comme: names (x) <- c ('a', 'b', 'c', 'd'). Vous pouvez ensuite les appeler x ['a'], x ['b'], etc. – JAponte

13

éléments de la liste dans R peuvent être nommés. Donc, dans votre cas faire juste

> mylist = list() 
> mylist$width = value 

Lorsque R rencontre ce code

> l$somename=something 

où l est une liste. Il ajoute à une liste un élément quelque chose, et le nomme avec le nom somename. Il est peut être accessible à l'aide

> l[["somename"]] 

ou

> l$somename 

Le nom peut être modifié avec des noms de commande:

> names(l)[names(l)=="somename"] <- "othername" 

Ou si vous maintenant la position de l'élément dans la liste par:

> names(l)[1] <- "someothername" 
7

La fonction intégrée setNames() facilite la création d'un hachage à partir de listes de clés et de valeurs données. (Merci à Nick K pour la meilleure suggestion.)

Utilisation: hh <- setNames(as.list(values), keys)

Exemple:

players <- c("bob", "tom", "tim", "tony", "tiny", "hubert", "herbert") 
rankings <- c(0.2027, 0.2187, 0.0378, 0.3334, 0.0161, 0.0555, 0.1357) 
league <- setNames(as.list(rankings), players) 

accéder ensuite les valeurs par les touches est facile:

league$bob 
[1] 0.2027 
league$hubert 
[1] 0.0555 
+2

'league2 <- setNames (as.list (classements), joueurs)' est environ 4,5 fois plus rapide, et puisqu'il utilise fonctions vectorisées, serait un moyen plus «R» de le faire. (Démo 'microbenchmark :: microbenchmark (ligue <- as.hash (joueurs, classements), league2 <- setNames (as.list (classements), joueurs), times = 1000)') –

+0

@NickK: d'accord, 'setNames' est une bien meilleure solution! J'ai remplacé la fonction définie par l'utilisateur avec elle. À votre santé! –

Questions connexes