In the Green Book, section 7.5 discusses new vector classes and uses quaternions as an example of a vector class that needs more than one number per element. I would like to define a new class that has a numeric vector and a logical vector of the same length that specifies whether the measurement was accurate. The following code does not behave as desired: > setClass("thing",representation("vector",accurate="logical")) [1] "thing" > dput(x <- new("thing",1:10,accurate=rep(T,10))) structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), accurate = c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), class = structure("thing", package = ".GlobalEnv")) > x[1:3] [1] 1 2 3 > dput(x[1:3]) c(1, 2, 3) > because, although the "accurate" slot is filled as desired in "x", when extracting the first three elements, it seems to be lost. What is the appropriate setClass() call to do what I want? Or indeed is making "thing" a vector class as sensible idea here? -- Robin Hankin Uncertainty Analyst National Oceanography Centre, Southampton European Way, Southampton SO14 3ZH, UK tel 023-8059-7743
>>>>> "Robin" == Robin Hankin <r.hankin at noc.soton.ac.uk> >>>>> on Tue, 29 Aug 2006 10:42:21 +0100 writes:Robin> In the Green Book, section 7.5 discusses new vector classes and uses Robin> quaternions Robin> as an example of a vector class that needs more than one number per Robin> element. Robin> I would like to define a new class that has a numeric vector and a Robin> logical Robin> vector of the same length that specifies whether the measurement was Robin> accurate. Robin> The following code does not behave as desired: >> setClass("thing",representation("vector",accurate="logical")) Robin> [1] "thing" >> dput(x <- new("thing",1:10,accurate=rep(T,10))) Robin> structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), accurate = c(TRUE, Robin> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), class = Robin> structure("thing", package = ".GlobalEnv")) >> x[1:3] Robin> [1] 1 2 3 >> dput(x[1:3]) Robin> c(1, 2, 3) >> Robin> because, although the "accurate" slot is filled as desired in "x", Robin> when extracting the first Robin> three elements, it seems to be lost. and you would really expect that ``R'' magically knows to it also must subset the accurate slote ? Robin> What is the appropriate setClass() call to do what I want? Or indeed Robin> is making "thing" Robin> a vector class as sensible idea here? I think you need to define at least a subset and subassign method for your class as well. Defining it as "vector" will automatically inherit all the method definitions for "vector" --- none of which will ``know anything'' about the accuracy slot. Therefore, I tend to think you rather define a class with "all slots" setClass("Thing", representation(x = "numeric", accurate = "logical")) and then you probably have to define many methods for that class, notably for "[" and also "[<-" where the latter should happen via setReplaceMethod("Thing", Also, I'd define a validity method, where you have to decide if 'accurate' must have the same length as 'x' -- or what it should mean if not. Martin
You might want to look at the source for the R 'its' package. It defines an S4 class for an irregular time series whose representation consists of 1. a matrix portion analogous to your vector portion to hold the series of multivariate series, and 2. a "dates" slot analogous to your accurate slot and defines numerous methods for this class. On 8/29/06, Robin Hankin <r.hankin at noc.soton.ac.uk> wrote:> In the Green Book, section 7.5 discusses new vector classes and uses > quaternions > as an example of a vector class that needs more than one number per > element. > > I would like to define a new class that has a numeric vector and a > logical > vector of the same length that specifies whether the measurement was > accurate. > > The following code does not behave as desired: > > > setClass("thing",representation("vector",accurate="logical")) > [1] "thing" > > dput(x <- new("thing",1:10,accurate=rep(T,10))) > structure(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), accurate = c(TRUE, > TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE), class > structure("thing", package = ".GlobalEnv")) > > x[1:3] > [1] 1 2 3 > > dput(x[1:3]) > c(1, 2, 3) > > > > because, although the "accurate" slot is filled as desired in "x", > when extracting the first > three elements, it seems to be lost. > > What is the appropriate setClass() call to do what I want? Or indeed > is making "thing" > a vector class as sensible idea here? > > > > > > -- > Robin Hankin > Uncertainty Analyst > National Oceanography Centre, Southampton > European Way, Southampton SO14 3ZH, UK > tel 023-8059-7743 > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel >