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)
}
#-----------------------------------------------------------------------
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.