[R] How to change the value of a class slot

Thomas Petzoldt thpe at hhbio.wasser.tu-dresden.de
Wed Jun 8 14:15:56 CEST 2005


Ross Boylan wrote:
> I defined an S4 class with a slot i.  Then I wrote a regular function
> that attempted to increment i.

[... details deleted ...]

> What do I need to do to update slot values?
>
> Here are some possibly relevant code fragments
> setClass("CompletePathMaker",
>          representation(i="integer",
>                         timeOffset="numeric", # to avoid 0's
>                         truePaths="TruePaths")
>          )
> nextPath <- function(pm){ #pm is a CompletePathMaker
>   pm at i <- pm at i+as.integer(1)
> [etc]
>
> I'm trying to make the class behave like an iterator, with i keeping
> track of its location.  I'm sure there are more R'ish ways to go, but
> I'm also pretty sure I'm going to want to be able to update slots.

Hello Ross,

I see that your question was related to S4, but I just noticed a
solution based on the R.oo package so I thought I would add a solution
based on the proto package too. We had similar problems several times
ago and (to my surprise) found R to be an extremely flexible language
even for these things. Our favorite solution is available as
package(proto). It requires R 2.1, because of several subtle
improvements regarding environments, which made our implementation more
streamlined.

Does the following example do what you intended?

##=====================================================
library(proto)

## 1) define an object
CompletePathMaker <- proto(
      index = 0,
      bumpIndex = function(., dindex = 1)
        .$index <- .$index + as.integer(dindex)
)

## 2) create a child object of CompletePathMaker
cpm <- CompletePathMaker$proto()

## 3) set the index component to 3
cpm$index <- 3

## 4) iterate the index
cpm$bumpIndex(2)

## print the result
cpm$index

##=====================================================

This approach is very compact and needs only one new function: proto.
Also note how simple it is conceptually. We did not even create any
classes. We just created a parent object CompletePathMaker and a child
to it, cpm, and got everything else via delegation (i.e. inheritance).


Hope it helps

Thomas P.




More information about the R-help mailing list