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){new...@bar <- 10})
> 
> 
> 
> z <- new('foo')
> 
> 
> 
> z...@stuff$x <- new('foo')
> 
> 
> 
> doit(z,z...@stuff$x)
> 
> 
> 
> z...@stuff$x@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.robert...@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@r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to