[R] How to reduce key strokes when defining S4 classes?

mtmorgan at fhcrc.org mtmorgan at fhcrc.org
Tue Oct 27 05:56:36 CET 2009


Quoting Peng Yu <pengyu.ut at gmail.com>:

> I feel tedious when I define a S4 class and the methods. For each
> method, I have to call both setMethod and setGeneric (or both
> setReplaceMethod and setGeneric). I would like a more compact grammar
> so that I can reduce the key strokes. I'm wondering if there is a
> better way available.
>
> setClass(
>     Class='A',
>     representation=representation(
>         x='numeric'
>         )
>     )
>
> setMethod(
>     f='initialize',
>     signature='A',
>     definition=function(.Object,x){
>       cat("~~~ A: initializator ~~~\n")
>       .Object<-callNextMethod(.Object,x=x)
>       return(.Object)
>     }
>     )
>
> setGeneric('getx', function(object){
>       standardGeneric('getx')
>     }
>     )
>
> setMethod('getx', 'A',
>     function(object){
>       return(object at x)
>     }
>     )

in some sense getx is redundant; x(obj) can only extract a value; more  
so with setx(obj) <- value and x(obj) <- value (illustrating partly  
that 'x' is a poor name for a slot).

>
> setGeneric('setx<-', function(.object,value){
>       standardGeneric('setx<-')
>     }
>     )
>
> setReplaceMethod(f='setx', signature='A',
>     def=function(.object,value){
>       .object at x<-value
>       return(.object)
>     }
>     )

one can create ad hoc getter / setter writers (e.g., in the  
Bioconductor GSEABase package), but in the long run I have found these  
to require more thought than the saved keystrokes are worth. You might  
be more clever / disciplined than I. It's tempting to write getters /  
setters as simple functions (setGeneric / setMethod is required  
because the defined 'generic' isn't really that generic, it's just an  
idiosyncratic accessor)  but in the long run this also doesn't seem to  
work well.

Martin

>
> a=new(Class='A',x=10)
> print(getx(a))
>
> setx(a)<-5
> print(getx(a))
>
> ______________________________________________
> 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.
>




More information about the R-help mailing list