From Troy.Robertson at aad.gov.au  Wed Jun 24 09:15:47 2009
From: Troy.Robertson at aad.gov.au (Troy Robertson)
Date: Wed, 24 Jun 2009 17:15:47 +1000
Subject: [Rd] V2.9.0 changes [Sec=Unclassified]
In-Reply-To: <4A40D7C2.7050307@fhcrc.org>
Message-ID: <42C7503E0B99F248B06BC65E7D2B4E020122C50FB22F@EX2K7-CCR.AAD.GOV.AU>

Thanks Martin,

Yes I can see that a slot can be initialised as an environment, and data stored within that environment but it seems to then require an additional layer of indirection to access data members within the environment and negates the use of slots in the first place.

The same goes for the "[[" function which works on an object which extends environment as I would expect slots within that object to work (but don't), eg allowing a pass-by-reference arrangement.

I hadn't encountered the use of .xdata as you demonstrated below and think I can work with this way of assigning data members to an S4 object, allowing for a pass-by-reference mechanism.  It just seems to negate the point of providing a slot mechanism for objects.

As for stepping back and re-thinking the way I am implementing my data structures and methods.  It is difficult coming from one way of coding in a different language.  It's easy to try and enforce that way of doing things on the new language.  Can you point me to any examples of general programming using S4 that I could use to change my way of thinking about the problem?

I will have a play around more tomorrow.

Cheers

Troy

> -----Original Message-----
> From: Martin Morgan [mailto:mtmorgan at fhcrc.org]
> Sent: Tuesday, 23 June 2009 11:25 PM
> To: Troy Robertson
> Cc: 'r-devel at R-project.org'
> Subject: Re: [Rd] V2.9.0 changes [Sec=Unclassified]
>
> Troy Robertson wrote:
> > Hi all,
> >
> >
> >
> > Prefix: I am a frustrated Java coder in R.
>
> ah good, if you're frustrated with Java you'll find R very different ;)
>
> >
> >
> >
> > I am coding a medium sized ecosystem modelling program in R.  I have
> changed to using S4 objects and it has cost me an order of magnitude in
> execution speed over the functional model.  I cannot afford this penalty
> and have found that it is the result of all the passing-by-value of
> objects.
> >
> >
> >
> > I see that you can now safely inherit from environment in V2.9.0.
> >
> > That got me all excited that I would now be able to pass objects by
> reference.
> >
> >
> >
> > But...
> >
> > That doesn't seem to be the case.
> >
> > It only seem that passing an environment which holds the object allows
> for pass-by-reference and that passing an object which inherits from
> environment doesn't.
> >
> > Why is this the case, either an object inherits the properties of its
> parent or it doesn't.
>
> The object inherits slots from it's parent, and the methods defined on
> the parent class. Maybe this example helps?
>
> setClass("Ticker", contains=".environment")
>
> ## initialize essential, so each instance gets its own environment
> setMethod(initialize, "Ticker",
>           function(.Object, ..., .xData=new.env(parent=emptyenv()))
> {
>     .xData[["count"]] <- 0
>     callNextMethod(.Object, ..., .xData=.xData)
> })
>
> ## tick: increment (private) counter by n
> setGeneric("tick", function(reference, n=1L) standardGeneric("tick"),
>            signature="reference")
>
> setMethod(tick, "Ticker", function(reference, n=1L) {
>     reference[["count"]] <- reference[["count"]] + n
> })
>
> ## tock: report current value of counter
> setGeneric("tock", function(reference) standardGeneric("tock"))
>
> setMethod(tock, "Ticker", function(reference) {
>     reference[["count"]]
> })
>
> and then
>
> > e <- new("Ticker")
> > tock(e)
> [1] 0
> > tick(e); tick(e, 10); tock(e)
> [1] 11
> > f <- e
> > tock(f); tick(e); tock(f)
> [1] 11
> [1] 12
>
> The data inside .environment could be structured, too, using S4.
> Probably it would be more appropriate to have the environment as a slot,
> rather the class that is being extended. And in terms of inherited
> 'properties', e.g., the "[[" function as defined on environments is
> available
>
> > e[["count"]]
>
> Of course I haven't seen your code, but a different interpretation of
> your performance issues is that, within the rules of S4, you've chosen
> to implement functionality in an inefficient way. So it might be
> instructive to step back a bit and try to reformulate your data
> structures and methods. This is hard to do.
>
> Martin
>
> >
> > Has anyone else had a play with this?  Or have I got it all wrong.
> >
> >
> >
> > I tried the below:
> >
> > ------------------------------------------------------------------------
> -----------------
> >
> > setClass('foo', representation=representation(stuff='list',
> bar='numeric'),
> >
> >                      prototype=list(stuff=list(), bar=0),
> >
> >                      contains='.environment')
> >
> >
> >
> > setGeneric('doit', function(.Object, newfoo='environment')
> standardGeneric('doit'))
> >
> >
> >
> > setMethod('doit', 'foo', function(.Object, newfoo){newfoo at bar <- 10})
> >
> >
> >
> > z <- new('foo')
> >
> >
> >
> > z at stuff$x <- new('foo')
> >
> >
> >
> > doit(z,z at stuff$x)
> >
> >
> >
> > z at stuff$x at bar
> >
> >
> >
> > [1] 0
> >
> > ------------------------------------------------------------------------
> ------------------
> >
> >
> >
> > Can anyone help with a better way of doing this.
> >
> > I'm trying to avoid all the indirection of packing and unpacking
> environments for passing.
> >
> >
> >
> >
> >
> > Thanks heaps
> >
> >
> >
> > Troy
> >
> >
> >
> >
> >
> > Troy Robertson
> >
> > Database and Computing Support Provider
> >
> > Southern Ocean Ecosystems, ERM/Fish
> >
> > Australian Antarctic Division
> >
> > Channel Highway, Kingston 7050
> >
> > PH: 03 62323571
> >
> > Troy.Robertson at aad.gov.au
> >
> >
> >
> >
> >
> __________________________________________________________________________
> _
> >
> >     Australian Antarctic Division - Commonwealth of Australia
> > IMPORTANT: This transmission is intended for the addressee only. If you
> are not the
> > intended recipient, you are notified that use or dissemination of this
> communication is
> > strictly prohibited by Commonwealth law. If you have received this
> transmission in error,
> > please notify the sender immediately by e-mail or by telephoning +61 3
> 6232 3209 and
> > DELETE the message.
> >         Visit our web site at http://www.antarctica.gov.au/
> >
> __________________________________________________________________________
> _
> >
> >       [[alternative HTML version deleted]]
> >
> > ______________________________________________
> > R-devel at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-devel

___________________________________________________________________________

    Australian Antarctic Division - Commonwealth of Australia
IMPORTANT: This transmission is intended for the addressee only. If you are not the
intended recipient, you are notified that use or dissemination of this communication is
strictly prohibited by Commonwealth law. If you have received this transmission in error,
please notify the sender immediately by e-mail or by telephoning +61 3 6232 3209 and
DELETE the message.
        Visit our web site at http://www.antarctica.gov.au/
___________________________________________________________________________



[Rd] V2.9.0 changes [Sec=Unclassified]
Troy Robertson