From maechler at stat.math.ethz.ch  Fri Jun 21 09:42:11 2013
From: maechler at stat.math.ethz.ch (Martin Maechler)
Date: Fri, 21 Jun 2013 09:42:11 +0200
Subject: [Rd] str and s3 classes
In-Reply-To: <CABdHhvH08vczUYU=gkcg4-BHypugmtP7GvgfNgWt5YPmXK0quA@mail.gmail.com>
References: <CABdHhvH08vczUYU=gkcg4-BHypugmtP7GvgfNgWt5YPmXK0quA@mail.gmail.com>
Message-ID: <20932.979.94491.579003@stat.math.ethz.ch>

>>>>> 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



[Rd] str and s3 classes
Martin Maechler