Re: [Rd] Fwd: Digest package - make digest generic?

From: Henrik Bengtsson <hb_at_stat.berkeley.edu>
Date: Tue, 16 Oct 2007 18:10:41 -0700

Hi,

if there is a need for a digest0(), which there seems to be, we should have one, but we should find a better name.

A better approach may be to keep digest() as is and introduce hashCode() for the feature Hadley requested, e.g.

hashCode <- function(...) UseMethod("hashCode"); hashCode.default <- function(...) digest(...);

Personally, I think hashCode() is a more descriptive term of the value/outcome whereas digest() describes the action. Of course, some of the arguments of digest() should be excluded from hashCode(), but the above gives you the idea.

That would make the distinction clear, and it is very much in line how Java is doing it (sorry Dylan folks). I think the Java got a useful setup with its hashCode() & equals() methods. If you want the details, here is one reference:

  http://www.geocities.com/technofundo/tech/java/equalhash.html

but the short story is that <quote>two objects that are "equal" must produce the same hash code as long as they are equal, however unequal objects need not produce distinct hash codes.</quote>. The equals() relationship should be reflexive, symmetric, transitive, consistent. For details, see above URL. These rules are very useful, but requires quite a bit of effort from the developer/maintainer in order to keep it up to date and valid.

Cheers

Henrik

On 10/16/07, Roger Peng <rdpeng_at_gmail.com> wrote:
> Calling 'digest.default' directly would not be possible if the method
> were hidden in a namespace (without resorting to some maneuvering).
> To force the default method I think you'd need to 'unclass' the
> object.
>
> I'm not against making 'digest' generic, but I'd prefer it if there
> were a guaranteed way to compute the digest of the "raw"/full object
> without having to wonder about class-specific behavior. Something
> like:
>
> digest0 <- [[the current 'digest' function]]
> digest <- function(object, ...) UseMethod("digest")
> digest.default <- function(object, ...) digest0(object, ...)
>
> As I think we've seen in this discussion already, what is surprising
> to one person may not be surprising to another (and vice versa) so
> having something like 'digest0' which is consistent across all R
> objects would be useful.
>
> -roger
>
> On 10/16/07, hadley wickham <h.wickham_at_gmail.com> wrote:
> > On 10/16/07, Roger Peng <rdpeng_at_gmail.com> wrote:
> > > My understanding was that Hadley wanted 'digest' to operate on part of
> > > an object rather than on the entire, which might contain uninteresting
> > > or irrelevant details. For example, if we had
> > >
> > > a <- structure(list(x = 1, y = 2), class = "foo")
> > > b <- structure(list(x = 2342342, y = 2), class = "foo")
> > >
> > > digest.foo <- function(object, ...) digest(object$y)
> >
> > Yes, that's exactly what I want, except in my case my objects contain
> > about 20 or 30 bits of information that are irrelevant (I'm my case
> > documentation about the class and other functions), so it would be
> > surprising if p1 and p2 which produced identical plots gave different
> > digests.
> >
> > If you want the default behaviour, you could always call
> > digest.default to digest the entire object.
> >
> > Hadley
> >
>
>
> --
> Roger D. Peng | http://www.biostat.jhsph.edu/~rpeng/
>
> ______________________________________________
> R-devel_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed 17 Oct 2007 - 01:14:25 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 25 Oct 2007 - 11:37:11 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.