An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110414/11e65959/attachment.pl>
Hash table...
3 messages · Worik R, Philipp Pagel, Duncan Murdoch
On Thu, Apr 14, 2011 at 06:44:53PM +1200, Worik R wrote:
To improve the efficiency of a process I am writing I would like to cache results. So I would like a data structure like a hash table. So if I call Z <- f(Y) I can cache Z associated with Y: CACHE[Y] <- Z I am stumped. I expected to be able to use a list for this but I cannot figure how....
If y is an integer, factor or string you could try something along these lines: cache <- list() y <- 12 cache[[as.character(y)]] <- sqrt(y) y<-98 cache[[as.character(y)]] <- sqrt(y) cache $`12` [1] 3.464102 $`98` [1] 9.899495 Of course this can get you in trouble if y is a floating point number because of the issues with "identity" of such numbers, as discussed in ?all.equal and FAQ 7.31 "Why doesn't R think these numbers are equal?". cu Philipp
Dr. Philipp Pagel Lehrstuhl f?r Genomorientierte Bioinformatik Technische Universit?t M?nchen Wissenschaftszentrum Weihenstephan Maximus-von-Imhof-Forum 3 85354 Freising, Germany http://webclu.bio.wzw.tum.de/~pagel
On 11-04-14 4:48 AM, Philipp Pagel wrote:
On Thu, Apr 14, 2011 at 06:44:53PM +1200, Worik R wrote:
To improve the efficiency of a process I am writing I would like to cache results. So I would like a data structure like a hash table. So if I call Z<- f(Y) I can cache Z associated with Y: CACHE[Y]<- Z I am stumped. I expected to be able to use a list for this but I cannot figure how....
If y is an integer, factor or string you could try something along these lines: cache<- list() y<- 12 cache[[as.character(y)]]<- sqrt(y) y<-98 cache[[as.character(y)]]<- sqrt(y) cache $`12` [1] 3.464102 $`98` [1] 9.899495 Of course this can get you in trouble if y is a floating point number because of the issues with "identity" of such numbers, as discussed in ?all.equal and FAQ 7.31 "Why doesn't R think these numbers are equal?".
I haven't actually done timing, but if there are likely to be a lot of y values, I'd expect an environment created with hash=TRUE to be faster, both in adding new items and in retrieving existing ones. The code is pretty similar: Use cache <- new.env(hash=TRUE) to create it, and ls(cache) to list the names, or as.list(cache) to print it as a list. Other than that, the assignment and retrieval code is identical. Duncan Murdoch