[R] Object equality for S4 objects

Martin Morgan mtmorgan at fhcrc.org
Thu Jul 30 22:03:19 CEST 2009


Stavros Macrakis wrote:
> On Thu, Jul 30, 2009 at 12:01 PM, Martin Morgan<mtmorgan at fhcrc.org> wrote:
>> S4 objects do not have the semantics of environments, but of lists (or of most other R objects), so it is as meaningful to ask why identical(s1, s2) returns TRUE as it is to ask why identical(list(x=1), list(x=1)) returns TRUE.
> 
> Thanks for the clarification.
> 
> For some reason, I thought that S4 objects (unlike S3 objects) were
> objects in the conventional computer science sense, that is, mutable.

S4 objects are mutable in the sense that one can write replacement 
methods for them


   setClass("A", representation=representation(aValue="logical"))
   setGeneric("aValue<-",
              function(object, value) standardGeneric("aValue<-"))
   setReplaceMethod("aValue", "A", function(object, value) {
       slot(object, "aValue") <- value
       object
   })

 > a <- b <- new("A", aValue=FALSE)
 > aValue(a) <- TRUE
 > a
An object of class "A"
Slot "aValue":
[1] TRUE

while preserving copy-on-change

 > b
An object of class "A"
Slot "aValue":
[1] FALSE

Martin

> Compare proto objects, which *are* objects in the usual sense:
> 
>> proto1 <- proto(expr= {x=23})
>> proto2 <- proto1
>> proto1$x <- 45
>> proto2$x
> [1] 45                    # proto1 and proto2 are the same object
> 
>> setClass("test",representation(a="logical"))
> [1] "test"
>> s41 <- new("test")
>> s42 <- s41
>> s41 at a <- TRUE
>> s42 at a              # s41 and s42 are different objects
> logical(0)
> 
> It would thus perhaps be clearer to speak of S4 "values" rather than
> S4 "objects".
> 
>                 -s


-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793




More information about the R-help mailing list