62

I have two variables, key and value, and I want to add them as a key/value pair to a list:

key = "width"
value = 32

mylist = list()
mylist$key = value

The result is this:

mylist
# $key
# [1] 32

But I would like this instead:

mylist
# $width
# [1] 32

How can I do this?

A5C1D2H2I1M1N2O1R2T1
  • 190,393
  • 28
  • 405
  • 485
Frank
  • 64,140
  • 93
  • 237
  • 324

4 Answers4

86

R lists can be thought of as hashes- vectors of objects that can be accessed by name. Using this approach you can add a new entry to the list like so:

key <- "width"
value <- 32

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

Here we use the string stored in the variable key to access a position in the list much like using the value stored in a loop variable i to access a vector through:

vector[ i ]

The result is:

myList
$width
[1] 32
vrajs5
  • 4,066
  • 1
  • 27
  • 44
Sharpie
  • 17,323
  • 4
  • 44
  • 47
  • 3
    Thanks! I don't really understand this indexing operator yet. Although it is explained here: http://cran.r-project.org/doc/manuals/R-lang.html#Indexing, the usage you showed is not described. Is there any online doc where this is described properly? – Frank Jul 10 '09 at 03:49
  • 1
    If the values are basic types (e.g. single numeric, character, etc.) you can use a regular array such as: x <- c(1, 4, 2, 5). Then assign names to each index value like: names(x) <- c('a', 'b', 'c', 'd'). You can then refer to them as x['a'], x['b'], etc. – JAponte Oct 18 '16 at 02:39
26

The setNames() built-in function makes it easy to create a hash from given key and value lists. (Thanks to Nick K for the better suggestion.)

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

Example:

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)

Then accessing the values through the keys is easy:

league$bob
 [1] 0.2027
league$hubert
 [1] 0.0555
Assad Ebrahim
  • 6,234
  • 8
  • 42
  • 68
16

List elements in R can be named. So in your case just do

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

When R encounters this code

> l$somename=something

where l is a list. It appends to a list an element something, and names it with name somename. It is then can be accessed by using

> l[["somename"]]

or

> l$somename

The name can be changed with command names:

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

Or if you now the position of the element in the list by:

> names(l)[1] <- "someothername"
mpiktas
  • 11,258
  • 7
  • 44
  • 57
0

We can use R's list data structure to store data in the form of key-value pair.

Syntax:

ObjectName<-list("key"= value)

Example:

mylist<-list("width"=32)

also, refer example: "https://github.com/WinVector/zmPDSwR/blob/master/Statlog/GCDSteps.R"

Brandon Minnick
  • 13,342
  • 15
  • 65
  • 123
AutomationNerd
  • 406
  • 1
  • 5
  • 12