[R] S4 pass-by-value work-around?
Jeffrey Spies
jspies2008 at gmail.com
Thu Jun 19 18:00:26 CEST 2008
Thanks for the response, Martin. While the solutions offered update the
object appropriately, we wouldn't get the desired return value (a string
followed by the counter, "unique_1") when the methods are called. Do you
know a way of dealing with this?
Jeff.
Martin Morgan wrote:
>
> 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--tp17997553p18012246.html
Sent from the R help mailing list archive at Nabble.com.
More information about the R-help
mailing list