[R] Which data structure in R can mimic hash in PERL best?

Duncan Temple Lang duncan at wald.ucdavis.edu
Sat Nov 15 17:54:17 CET 2008



Hans W. Borchers wrote:
>> Dear all,
>>
>>    Which data structure in R can mimic hash in PERL? I'd like to set
>> up a lookup table, which could be accomplished by HASH if using PERL.
>> Which of the data structures in R is the most efficient for lookup
>> table?
>> Thanks for your help.
>>
>> Best regards,
>> Leon
> 
> The regular answer to this is "named arrays/vectors" or "environments" 
> and has been given several times here on R-help. Unfortunately, 
> everybody is applying a different terminology such as 'maps', 'hashes', 
> 'tables' or 'dictionaries', etc., so it's difficult to search for those 
> entries.
> 
> Below I enclose a solution that I have written some month ago. It is 
> given in pythonic language, but you can easily translate it into the 
> corresponding Perl terms. One drawback is that one cannot use numbers
> as keys, only keys following the naming conventions for variable names
> are allowed.

I imagine that you want to add inherits = FALSE
to calls to exists() and get() in your code or
else you risk quite unusual semantics of a hash table.

  D.

> 
> Hans Werner Borchers
> ABB Corporate Research
> 
> 
> #-- Define functions on Hash Tuples (Python alike) ---------------------
> 
> def.h <- function() new.env(hash=TRUE)
> len.h <- function(dict) length(ls(envir=dict))
> set.h <- function(key, val, dict) assign(key, val, envir=dict)
> get.h <- function(key, dict, default=NULL) {
>     if (exists(key, envir=dict)) { get(key, dict)
>     } else { default } 
> }
> has_key <- function(key, dict) exists(key, envir=dict)
> keys.h <- function(dict) ls(envir=dict)
> items.h <- function(dict) as.list(dict)
> values.h <- function(dict, mode='character') {
>     l <- as.list(dict)
>     n <- length(l)
>     if (n==0) invisible(NULL)
>     v <- vector('character', n)
>     for (i in 1:n) v[i] <- l[[i]]
>     if (mode=='numeric') v <- as.numeric(v)
>     return(v)
> }
> del.h <- function(key, dict) {
>     if (exists(key, envir=dict)) {
>         val <- get.h(key, dict)
>         rm(list=c(key), envir=dict)
>     } else {
>         val <- NULL
>     }
>     invisible(val)
> }
> clear.h <- function(dict) {
>     rm(list=keys.h(dict), envir=dict)
> }
> #-----------------------------------------------------------------------
>



More information about the R-help mailing list