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

From: Duncan Temple Lang <duncan_at_wald.ucdavis.edu>
Date: Sat, 15 Nov 2008 08:54:17 -0800

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_at_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. Received on Sat 15 Nov 2008 - 16:56:51 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 15 Nov 2008 - 20:30:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive