[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