====== Dictionaries in R ====== Dictionary is a data structure containing pairs (key, value) providing fast (usually constant time) access to a value corresponding to a given key. Dictionary data structure is available in most modern high level programming languages. In R they are not provided explicitly, but can be implemented using [[http://adv-r.had.co.nz/Environments.html|environments]]. As an example, consider a list of cows K. Their names are **keys**. To each name we assign a **value** with two components: index i and repetition count n combined into a list. If necessary additional components can be included in the list. > K <- c("Liska", "Šeka", "Bistra", "Sivka", "Liska", "Cika", "Belka", "Liska", "Sivka", "Pika") > ime <- new.env(hash=TRUE,parent=emptyenv()) > for(k in K){ + if (exists(k,env=ime,inherits=FALSE)){ + d <- get(k,env=ime,inherits=FALSE) + ik <- d$i; nk <- d$n+1 + assign(k,list(i=ik,n=nk),env=ime) + } else { + ik <- length(ls(ime))+1; nk <- 1 + assign(k,list(i=ik,n=nk),env=ime) + } + cat(format(k,width=8),ik,nk,"\n") + } Liska 1 1 Šeka 2 1 Bistra 3 1 Sivka 4 1 Liska 1 2 Cika 5 1 Belka 6 1 Liska 1 3 Sivka 4 2 Pika 7 1 In the case when we need only the index of a given cow k we can (write and) use the function kInd(k): > kInd <- function(k) return(if(exists(k,env=ime,inherits=FALSE)) get(k,env=ime,inherits=FALSE)$i else NA) > kInd("Sivka") [1] 4 > kInd("Hator") [1] NA ===== URLs ===== * https://www.r-bloggers.com/environments-in-r/ * http://www.quantide.com/ramarro-chapter-03/