Yohan Chalabi
2008-Aug-07 13:37 UTC
[Rd] '"ts" treated as a registered S3 class, but keep its "structure" behaviour' ?
Dear all, In R-devel I have noticed the new approach for the "ts" class in the package "methods". the "structure" behaviour of "ts" is not always kept when one uses "ts" objects and objects of classes which extend the virtual class "structure". As a short example: ## this works fine setClass("foo", representation(header = "character"), contains = "structure") foo <- new("foo", 1:10, header = "foo") ts <- ts(1:10) foo / ts ## but the problem appears when one defines an "Ops" method for class "foo" setMethod("Ops", c("foo", "foo"), function(e1, e2) { .Data <- callGeneric(e1 at .Data, e2 at .Data) header <- paste(e1 at header, e2 at header, sep = "_") new("foo", .Data, header = header) }) foo <- new("foo", 1:10, header = "foo") foo + foo ts <- ts(1:10) foo / ts # Error in getDataPart(1:10) : no '.Data' slot defined for class "ts" Is this the expected behavior? regards, Yohan -- PhD student Swiss Federal Institute of Technology Zurich www.ethz.ch
John Chambers
2008-Aug-07 16:11 UTC
[Rd] '"ts" treated as a registered S3 class, but keep its "structure" behaviour' ?
Yohan Chalabi wrote:> Dear all, > > In R-devel I have noticed the new approach for the "ts" class in the > package "methods". > > the "structure" behaviour of "ts" is not always kept when one uses > "ts" objects and objects of classes which extend the virtual class > "structure". > > As a short example: > > ## this works fine > setClass("foo", representation(header = "character"), contains = "structure") > foo <- new("foo", 1:10, header = "foo") > ts <- ts(1:10) > foo / ts > > ## but the problem appears when one defines an "Ops" method for class "foo" > setMethod("Ops", c("foo", "foo"), > function(e1, e2) { > .Data <- callGeneric(e1 at .Data, e2 at .Data) > header <- paste(e1 at header, e2 at header, sep = "_") > new("foo", .Data, header = header) > }) > foo <- new("foo", 1:10, header = "foo") > foo + foo > ts <- ts(1:10) > foo / ts > # Error in getDataPart(1:10) : no '.Data' slot defined for class "ts" > > Is this the expected behavior? >No, not expected. It may take some special treatement to fix it, though. Your subject heading is indeed the problem. Normally, the structure of an S3 class is a black box, and no S4 slots should usually be associated with it when it's registered via setOldClass. However, just because "ts" does want to be a "structure" class, it would be nice to give it a .Data slot. I'll experiment with this and see if it causes other things to break immediately. Thanks for the report. John Chambers> regards, > Yohan > > -- > PhD student > Swiss Federal Institute of Technology > Zurich > > www.ethz.ch > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >