[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