[R] Hashes as S4 Classes, or: How to separate environments

Hans W Borchers hwborchers at gmail.com
Sat May 10 13:30:27 CEST 2008


For learning purposes mainly I attempted to implement hashes/maps/dictionaries
(Python lingua) as S4 classes, see the coding below. I came across some rough S4
edges, but in the end it worked (for one dictionary).

When testing ones sees that the dictionaries D1 and D2 share their environments
D1 at hash and D2 at hash, though I thought a new and empty environment would be
generated each time 'new("Dict")' is called.

QUESTION: How can I separate the environments D1 at hash and D2 at hash ?

Reading the articles mentioned in "Tipps and Tricks" didn't help me really.
Of course, I will welcome other corrections and improvements as well.
Working in R 2.7.0 under Windows.

Hans Werner


#-- Class and method definition for dictionaries -------------------------------

setClass("Dict",
    representation (hash = "environment"),
    prototype (hash = new.env(hash=T, parent = emptyenv()))
)

setMethod("show", signature(object="Dict"),
    definition = function(object) ls(object at hash)
)

setGeneric("hclear", function(object) standardGeneric("hclear"))
setMethod("hclear", signature(object="Dict"),
    function(object) rm(list=ls(object at hash), envir=object at hash)
)

setGeneric("hput", function(object, key, value) standardGeneric("hput"))
setMethod("hput", signature(object="Dict", key="character", value="ANY"),
    function(object, key, value) assign(key, value, envir=object at hash)
)

setGeneric("hget", function(object, key, ...) standardGeneric("hget"))
setMethod("hget", signature(object="Dict", key="character"),
    function(object, key) {
        if (exists(key, envir=object at hash, inherits = FALSE)) {
            get(key, envir=object at hash)
        } else {
            return(NULL)
        }
    }
)

# ---- Some tests ----
D1 <- new("Dict")
hput(D1, "a", 1)   # Same as: D1 at hash$a <- 1
hput(D1, "b", 2)
hget(D1, "a")
hget(D1, "b")
show(D1)

D2 <- new("Dict")
hput(D2, "c", 3)
hput(D2, "d", 4)
hget(D2, "a")      # Wrong: was defined only for D1
hget(D2, "b")
show(D2)

hclear(D2)         # Wrong: clears D1 too
show(D1)
#---------------------



More information about the R-help mailing list