[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