[R] Method for $

Berton Gunter gunter.berton at gene.com
Fri Nov 18 18:42:12 CET 2005


I believe that a  recommended S4 convention is simply to write methods for
slot extraction with the same name as the slot. Thus, for an object,x of
class 'myclass'

slotname(x) 

would give x at slotname. This is a more natural interface than either @ or $
(and I am not sure that methods for $ can be defined due to S3/S4 class
consistency details). 

Obviously, it is trivial, but a bit tedious, to manually write such methods
for any class you care to. However, I wrote a small generator function that
automatically generates the slot extraction methods for any class if you
wish to do things this way. I just run this right after I've define a new
class,'myclass', to generate slot access methods by: slotget('myclass') 

The code is below. I would appreciate feedback on any errors or suggestions
for improvement.

Cheers,

-- Bert Gunter
Genentech Non-Clinical Statistics
South San Francisco, CA



slotGet<-function(x,where=topenv())
#automatically generates accessor and replacement methods for class x
{
	if(!isClass(x,where=where))stop(paste('Class',x,'not found'))
	slots<-slotNames(getClass(x,where=where))
    for(slt in slots){
    		## slot accessor
        fun<-function(object)NULL
		if(!isGeneric(slt,where=where)){
			if(exists(slt,where=where,mode="function"))
				fun<-get(slt,pos=where,mode="function")
			else body(fun)<-substitute(standardGeneric(slt))
			setGeneric(slt,fun,where=where)
		}
		if(!existsMethod(slt,x,where=where)){
		  body(fun)<-substitute(object at slt)
		  setMethod(slt,x,fun,where=where)
        }
	}
	invisible()
}
 
 

> -----Original Message-----
> From: r-help-bounces at stat.math.ethz.ch 
> [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Uwe Ligges
> Sent: Friday, November 18, 2005 8:46 AM
> To: Ulrike Grömping
> Cc: r-help at stat.math.ethz.ch
> Subject: Re: [R] Method for $
> 
> Ulrike Grömping wrote:
> 
> > Dear R experts,
> > 
> > I have defined a class "myclass" and would like the slots 
> to be extractable 
> > not only by "@" but also by "$". I now try to write a 
> method for "$" that 
> > simply executes the request object at slotname, whenever someone calls 
> > object$slotname for any object of class "myclass".
> > I don't manage to find out how I can provide this function 
> with "slotname", 
> > so that one and the same function works for any arbitrary 
> slotname a user 
> > might choose.
> > 
> > I have tried
> > 
> > setMethod("$", signature(x="myclass"), function(x,slotname){ 
> >  x at slotname 
> >  } 
> > )
> 
> 
> Ulrike,
> 
> what about (untested!):
> slot(x, slotname)
> 
> Best wishes from Dortmund and Lena,
> Uwe Ligges
> 
> 
> > This produced the error message: 
> > In method for function "$": expanding the signature to 
> > include omitted arguments in definition: name = "missing" 
> > Error in rematchDefinition(definition, fdef, mnames, 
> fnames, signature) : 
> >         methods can add arguments to the generic only if 
> '...' is an argument 
> > to the generic
> > 
> > My searches for a solution of this problem have not been 
> successful. Can 
> > someone help? 
> > 
> > Thanks and regards,
> > Ulrike Grömping, Berlin
> > 
> > ______________________________________________
> > R-help at stat.math.ethz.ch mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! 
> http://www.R-project.org/posting-guide.html
>




More information about the R-help mailing list