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
[EMAIL PROTECTED] and [EMAIL PROTECTED], though I thought a new and empty 
environment would be
generated each time 'new("Dict")' is called.

QUESTION: How can I separate the environments [EMAIL PROTECTED] and [EMAIL 
PROTECTED] ?

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([EMAIL PROTECTED])
)

setGeneric("hclear", function(object) standardGeneric("hclear"))
setMethod("hclear", signature(object="Dict"),
    function(object) rm(list=ls([EMAIL PROTECTED]), [EMAIL PROTECTED])
)

setGeneric("hput", function(object, key, value) standardGeneric("hput"))
setMethod("hput", signature(object="Dict", key="character", value="ANY"),
    function(object, key, value) assign(key, value, [EMAIL PROTECTED])
)

setGeneric("hget", function(object, key, ...) standardGeneric("hget"))
setMethod("hget", signature(object="Dict", key="character"),
    function(object, key) {
        if (exists(key, [EMAIL PROTECTED], inherits = FALSE)) {
            get(key, [EMAIL PROTECTED])
        } else {
            return(NULL)
        }
    }
)

# ---- Some tests ----
D1 <- new("Dict")
hput(D1, "a", 1)   # Same as: [EMAIL PROTECTED] <- 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)
#---------------------

______________________________________________
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.

Reply via email to