Re: [R] S4 pass-by-value work-around?

From: Martin Morgan <mtmorgan_at_fhcrc.org>
Date: Thu, 19 Jun 2008 08:42:12 -0700

Hi Jeff --

two different scenarios are to overwrite the current object, along the lines of

y <- uniquify(y)

where uniquify is a method like createUniqueName but returns the (modified) instance rather than unique name

setMethod('uniquify', 'MyMatrix', function(x) {

    x_at_uniqueCount <- # something unique
    x
})

The second is a replacement method, along the lines of

setGeneric("uniqueCount<-",

    function(x, ..., value) standardGeneric("uniqueCount<-"))

setReplaceMethod("uniqueCount",

    signature=c(x="MyMatrix", value="numeric"),     function(x, ..., value) {

        x_at_uniqueCount <- value
        x

    })

uniqueCount(x) <- uniqueCount(x) + 1
x # now modified

This is untested psuedo-code, so I hope it's right enough to get you going.

Martin

Jeffrey Spies <jspies2008_at_gmail.com> writes:

> Howdy all,
>
> I have a problem that I'd like some advice/help in solving---it has to do
> with R's pass-by-value system. I understand the issue, but am wondering if
> anyone has found a working solution in dealing with it for cases when one
> wants to modify an object inside of a method, specifically when working with
> S4. I'm aware that R.oo is able to deal with this using S3, but I'd really
> rather stick to S4.
>
> The basics of what I would like to do are coded below:
>
> setClass("MyMatrix",
> representation(
> parameters="matrix",
> uniqueCount="numeric"
> ),
> prototype(
> parameters=matrix(numeric(0),0,0),
> uniqueCount=1
> )
> )
>
> setGeneric("createUniqueName", function(object)
> standardGeneric("createUniqueName"))
>
> setMethod("createUniqueName", "MyMatrix", function(object){
> retval <- paste("unique_", object_at_uniqueCount, sep="")
> object_at_uniqueCount <- object_at_uniqueCount + 1
> return(retval)
> })
>
> x <- new("MyMatrix", parameters=matrix(0, 2, 2))
> createUniqueName(x) # returns "unique_1"
> x # x_at_uniqueCount is still 1
>
> I understand why this is happening, but am wondering how people in the
> community have dealt with it, specifically when using S4. Any advice would
> be appreciated. Also, I am aware that this is somewhat of a silly example,
> but it should allow you to see what I'm trying to accomplish.
>
> Thank you,
>
> Jeff.
>
>
> --
> View this message in context: http://www.nabble.com/S4-pass-by-value-work-around--tp17997553p17997553.html
> Sent from the R help mailing list archive at Nabble.com.
>
> ______________________________________________
> R-help_at_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.

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

Location: Arnold Building M2 B169
Phone: (206) 667-2793

______________________________________________
R-help_at_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.
Received on Sat 21 Jun 2008 - 02:53:57 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Sat 21 Jun 2008 - 03:31:15 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive