[R] S4 vs Reference Classes

Douglas Bates bates at stat.wisc.edu
Tue Sep 13 23:26:45 CEST 2011


On Tue, Sep 13, 2011 at 4:11 PM, Steve Lianoglou
<mailinglist.honeypot at gmail.com> wrote:
> Hi,
>
> On Tue, Sep 13, 2011 at 1:54 PM, Joseph Park <jpark.us at att.net> wrote:
>>
>>   Hi, I'm looking for some guidance on whether to use
>>   S4 or Reference Classes for an analysis application
>>   I'm developing.
>>   I'm a C++/Python developer, and like to 'think' in OOD.
>>   I started my app with S4, thinking that was the best
>>   set of OO features in R. However, it appears that one
>>   needs Reference Classes to allow object methods to assign
>>   values (other than the .Object in the initialize method)
>>   to slots of the object.
>>   This is typically what I prefer: creating an object, then
>>   operating on the object (reference) calling object methods
>>   to access/modify slots.
>>   So I'm wondering what (dis)advantages there are in
>>   developing with S4 vs Reference Classes.
>>   Things of interest:
>>   Performance (i.e. memory management)
>>   Integration compatibility with R packages
>>   ??? other issues
>
> I actually don't have much experience with Reference Classes and
> (most) all of my R OO(P|D) with S4 (since I'm generally playing w/
> bioconductor stuff, which has an S4 mandate).
>
> I'm not sure exactly what you are after, but the way I design many of
> my classes to enable them to have *some* pass by reference semantics
> is to add a slot of type `environment` to the class def, like so:
>
> setClass("Something",
>  representation=representation(x='numeric', cache='environment'),
>  prototype=prototype(x=numeric(), cache=new.env()))
>
> Anything that gets put in `cache` is "passed by ref" so to speak. Consider this:
>
> R> s1 <- new("Something", x=10)
> R> s1 at cache$by.reference <- 'there can be only 1'
>
> R> s2 <- s1
> R> s2 at x
> [1] 10
>
> R> s2 at x <- 12
> R> s2 at x
> [1] 12
>
> R> s1 at x
> [1] 10
>
> R> s1 at cache$by.reference
> [1] "there can be only 1"
>
> R> s2 at cache$by.reference <- 'and then there were 2'
> R> s2 at cache$by.reference
> [1] "and then there were 2"
>
> R> s1 at cache$by.reference
> [1] "and then there were 2"
>

That is essentially how reference classes are implemented (plus a lot
of syntactic sugar).



More information about the R-help mailing list