From ripley at stats.ox.ac.uk  Tue Feb 13 09:38:37 2007
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Tue, 13 Feb 2007 08:38:37 +0000 (GMT)
Subject: [Rd] bug in partial matching of attribute names
In-Reply-To: <45D0E2A3.4020201@blackmesacapital.com>
References: <45D0E2A3.4020201@blackmesacapital.com>
Message-ID: <Pine.LNX.4.64.0702130835100.10412@auk.stats>

It happens that I was looking at this yesterday (in connection with 
encodings on CHARSXPs) and have a fix in testing across CRAN right now.

As for "names", as you will know from reading 'R Internals' the names can 
be stored in more than one place, which is why it has to be treated 
specially.

On Mon, 12 Feb 2007, Tony Plate wrote:

> There looks to be a bug in do_attr() (src/main/attrib.c): incorrect
> partial matches of attribute names can be returned when there are an odd
> number of partial matches.
>
> E.g.:
>
> > x <- c(a=1,b=2)
> > attr(x, "abcdef") <- 99
> > attr(x, "ab")
> [1] 99
> > attr(x, "abc") <- 100
> > attr(x, "ab") # correctly returns NULL because of ambig partial match
> NULL
> > attr(x, "abcd") <- 101
> > attr(x, "ab") # incorrectly returns non-NULL for ambig partial match
> [1] 101
> > names(attributes(x))
> [1] "names"  "abcdef" "abc"    "abcd"
> >
>
> The problem in do_attr() looks to be that after match is set to
> PARTIAL2, it can be set back to PARTIAL again.  I think a simple fix is
> to add a "break" in this block in do_attr():
>
>     else if (match == PARTIAL) {
> 	/* this match is partial and we already have a partial match,
> 	   so the query is ambiguous and we return R_NilValue */
> 	match = PARTIAL2;
> 	break; /* <---- ADD BREAK HERE */
>     } else {
>
> However, if this is indeed a bug, would this be a good opportunity to
> get rid of partial matching on attribute names -- it was broken anyway
> -- so toss it out? :-)  Does anyone depend on partial matching for
> attribute names?  My view is that it's one of those things like partial
> matching of list and vector element names that seemed like a good idea
> at first, but turns out to be more trouble than it's worth.
>
> On a related topic, partial matching does not seem to work for the
> "names" attribute (which I would regard as a good thing :-).  However,
> I'm puzzled why it doesn't work, because the code in do_attr() seems to
> try hard to make it work.  Can anybody explain why?
>
> E.g.:
> > attr(x, "names")
> [1] "a" "b"
> > attr(x, "nam")
> NULL
>
> > sessionInfo()
> R version 2.4.1 (2006-12-18)
> i386-pc-mingw32
>
> locale:
> LC_COLLATE=English_United States.1252;LC_CTYPE=English_United
> States.1252;LC_MONETARY=English_United
> States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252
>
> attached base packages:
> [1] "stats"     "graphics"  "grDevices" "utils"     "datasets"  "methods"
> [7] "base"
> >
>
> -- Tony Plate
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] bug in partial matching of attribute names
Prof Brian Ripley