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
>