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 suchexamples...> 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 bruteforce> 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 thedrop> argument -- it is ignored. > > I would appreciate any pointers about how to do this properly. If thisis> 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}}