[Rd] str and s3 classes
Martin Maechler
maechler at stat.math.ethz.ch
Fri Jun 21 09:42:11 CEST 2013
>>>>> Hadley Wickham <h.wickham at gmail.com>
>>>>> on Wed, 19 Jun 2013 15:44:05 -0500 writes:
> Hi all, Because str uses the generic version of length and
> names, it's currently very easy to create objects that
> break str:
> a <- structure(list(1:5), class = "a")
> length.a <- function(x) 2L
> str(a)
> b <- structure(list(1:5), class = "b")
> names.b <-function(x) character()
> str(b)
> These are obvious toy examples, but it is a real problem
> if you want to create a class that defines names or length
> in a meaningful way, that is incompatible with the
> underlying data structure.
Yes indeed, (and "well know").
I'm arguing that in such a situation, i.e., where you
explicitly let length() --- or `[` --- behave incompatibly
with respect to the underlying data structure,
you have to define your own str() S3 method.
I/we have done so ourselves in quite a few cases;
typically this is a 1- or 2-liner, possibly calling
utils:::str.default().
I do actually think we should *un*hide str.default() for such
situations.
In such a case (and not only here), using an S4 class instead of
an S3 is much more natural IMO.
But of course, we can discuss the issue here; that's exactly
what I think R-devel is for.
With regards (also to the Rstudio team),
Martin Maechler,
ETH Zurich
More information about the R-devel
mailing list