Folks:
This is a question about the S4 formal class system.
Suppose I have a class, 'foo', defined by:
setClass('foo',representation(dat='matrix',
id='character') )
I wish to define a '[' method for foo that will extract from the
'dat' slot.
I would have thought that the following would work, but it doesn't:
setMethod("[","foo",function(x,i, j,
.,drop=TRUE)callGeneric(x@dat,i,
j,drop=drop) )
The only way I have succeeded in defining this method is using brute force
eval(parse(. :
{eval(parse(text=paste('.dat(x)[',
ifelse(missing(i),',','i,'),
ifelse(missing(j),']','j]'))))
}
This works. However, I am not able under any circumstances to pass the drop
argument -- it is ignored.
I would appreciate any pointers about how to do this properly. If this is
explicitly in the Green Book (I do not have it with me at the moment), that
will suffice.
Thanks.
Bert Gunter
[[alternative HTML version deleted]]
On 6/20/05, Berton Gunter <gunter.berton at gene.com> wrote:> Folks: > > This is a question about the S4 formal class system. > > Suppose I have a class, 'foo', defined by: > > setClass('foo',representation(dat='matrix', id='character') ) > > I wish to define a '[' method for foo that will extract from the 'dat' slot. > I would have thought that the following would work, but it doesn't: > > setMethod("[","foo",function(x,i, j, .,drop=TRUE)callGeneric(x at dat,i, > j,drop=drop) ) > > The only way I have succeeded in defining this method is using brute force > eval(parse(. : > > {eval(parse(text=paste('.dat(x)[', > ifelse(missing(i),',','i,'), > ifelse(missing(j),']','j]')))) > } > > This works. However, I am not able under any circumstances to pass the drop > argument -- it is ignored. > > I would appreciate any pointers about how to do this properly. If this is > explicitly in the Green Book (I do not have it with me at the moment), that > will suffice. >Download the source to the 'its' package where an S4 [ method is defined.
setMethod("[","foo",function(x,i, j,
.,drop=TRUE)callGeneric(x at dat,i,j,drop=drop) )
^^^
You have a typo. Use ... instead of . (note ?"[").
Best,
Robert
Robert McGehee
Quantitative Analyst
Geode Capital Management, LLC
53 State Street, 5th Floor | Boston, MA | 02109
Tel: 617/392-8396 Fax:617/476-6389
mailto:robert.mcgehee at geodecapital.com
-----Original Message-----
From: Berton Gunter [mailto:gunter.berton at gene.com]
Sent: Monday, June 20, 2005 4:25 PM
To: r-help at stat.math.ethz.ch
Subject: [R] How to define S4 methods for '['
Folks:
This is a question about the S4 formal class system.
Suppose I have a class, 'foo', defined by:
setClass('foo',representation(dat='matrix',
id='character') )
I wish to define a '[' method for foo that will extract from the
'dat'
slot.
I would have thought that the following would work, but it doesn't:
setMethod("[","foo",function(x,i, j,
.,drop=TRUE)callGeneric(x at dat,i,
j,drop=drop) )
The only way I have succeeded in defining this method is using brute
force
eval(parse(. :
{eval(parse(text=paste('.dat(x)[',
ifelse(missing(i),',','i,'),
ifelse(missing(j),']','j]'))))
}
This works. However, I am not able under any circumstances to pass the
drop
argument -- it is ignored.
I would appreciate any pointers about how to do this properly. If this
is
explicitly in the Green Book (I do not have it with me at the moment),
that
will suffice.
Thanks.
Bert Gunter
[[alternative HTML version deleted]]
______________________________________________
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
I have found this a useful correspondence. My own wish is to define a new
S4 class which differs from
class 'array' only in its default handling of the 'drop'
argument i.e.
drop=FALSE - not an unusual wish.
My solution is the following:
setClass("noDropArray",representation("array"),prototype=array(NA,2:4))
setMethod('[','noDropArray',function(x,i,j,drop,...){
cl<-as.list(sys.call())
if( !("drop"%in%names(as.list(sys.call()))) )
cl <- c(cl,drop=FALSE)
cl[[2]]<-x at .Data
eval(as.call(cl))
})
new("noDropArray")[1,1,1]
This behaves as I would expect. However I have an uncomfortable feeling
that this is not the most
elegant solution.
Any comments?
- Giles
> Thanks to Robert and Gabor for their replies, but neither was what I was
> looking for, undoubtedly because of the poor phrasing of my question (+ a
> typo -- however, even if correctly typed it doesn't work). I finally
> realized that the "elegant" approach I sought can easily be done
without
> setGeneric:
> setMethod('[','foo',function(x,i,j,drop,...){
> cl<-as.list(sys.call())
> cl[[2]]<-x at dat
> eval(as.call(cl))
> })
> Indeed, this is a general template for this sort of thing. Should have
> thought of this before, as V&R's S PROGRAMMING has numerous such
examples...> Sigh...
> -- Bert
-----Original Message-----
From: Gabor Grothendieck [mailto:ggrothendieck at gmail.com]
Sent: Monday, June 20, 2005 1:31 PM
To: Berton Gunter
Cc: r-help at stat.math.ethz.ch
Subject: Re: [R] How to define S4 methods for '['
On 6/20/05, Berton Gunter <gunter.berton at gene.com>
wrote:> Folks:
>
> This is a question about the S4 formal class system.
>
> Suppose I have a class, 'foo', defined by:
>
> setClass('foo',representation(dat='matrix',
id='character') )
>
> I wish to define a '[' method for foo that will extract from the
'dat'
slot.> I would have thought that the following would work, but it doesn't:
>
> setMethod("[","foo",function(x,i, j,
.,drop=TRUE)callGeneric(x at dat,i,
> j,drop=drop) )
>
> The only way I have succeeded in defining this method is using brute
force> eval(parse(. :
>
> {eval(parse(text=paste('.dat(x)[',
> ifelse(missing(i),',','i,'),
> ifelse(missing(j),']','j]'))))
> }
>
> This works. However, I am not able under any circumstances to pass the
drop> argument -- it is ignored.
>
> I would appreciate any pointers about how to do this properly. If this
is> explicitly in the Green Book (I do not have it with me at the moment),
that> will suffice.
>
Download the source to the 'its' package where an S4 [ method is
defined.
______________________________________________
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
---------------------------------------------------------------------------
This message (including any attachments) is confidential and...{{dropped}}