[Rd] names<- bug, and incompatibility with c() (PR#2358)

Mark.Bravington@csiro.au Mark.Bravington@csiro.au
Tue Dec 10 23:32:02 2002

#> From: Mark.Bravington@csiro.au 

#> When assigning names to parts of an hitherto-unnamed vector,
#> there is inconsistent behaviour depending on whether the 
#element being named
#> is the last one:
#> test> mm <- 1:3
#> test> names( mm)[1] <- 'y'
#> Error in "names<-.default"(*tmp*, value = "y") :
#>         names attribute must be the same length as the vector
#> test> names( mm)[2] <- 'y'
#> Error in "names<-.default"(*tmp*, value = "y") :
#>         names attribute must be the same length as the vector
#> test> names( mm)[3] <- 'y'
#> test> mm
#> <NA> <NA>    y
#>    1    2    3

#From: ripley@stats.ox.ac.uk [mailto:ripley@stats.ox.ac.uk]

#Subject: Re: [Rd] names<- bug, and incompatibility with c() (PR#2358)
#This is S-compatible, though, and it I think it is quite legitimately
#an error.  I will fix it in R-devel, but I am little concerned that
#advanced users may be surprised (but they probably would never 
#do this).

don't be so sure! The "names" attribute can be useful for many things
besides the obvious-- "There are more things in heaven and earth,
Horatio,..."   ;)

#>  Note that "c" has supplied an empty string for the 
#unspecified name, and
#> has also taken the liberty of changing the special NA-string 
#into a "NA"
#> (i.e. a 2-character string, first letter N, second letter A)!
#That's a bug.

If you use NA-strings for unsupplied names, then will you for consistency be
making another change to c() so that

> mm <- c( a=1, b=2)
> mm <- c( mm, 5)

now gives an NA-string for mm's 3rd name? 

#> An easy way to achieve consistency, would be to make 
#unsupplied names should
#> always default to an empty string, rather than a special NA-string.
#But what's the point of having a special string then?

That's just what I was wondering (in the specific case of names attributes).
I can see the logic of NA-string names, but I do wonder whether this will
cause more practical problems than just using an empty string. It's not just
back-compatibility, but also unexpected behaviour. For example, after
setting up mm as above:

test> mm
<NA> <NA>    y 
   1    2    3 
test> names( mm)=='y'
[1]   NA   NA TRUE
test> mm[ names(mm)=='y']
<NA> <NA>    y 
  NA   NA    3 

the last line being a bit surprising to me, anyway. It's not a bug, but will
it be helpful? Empty names instead of NA-names give a behaviour that seems
to me more "natural". 



Mark Bravington
PO Box 1538
Castray Esplanade
TAS 7001

phone (61) 3 6232 5118
fax (61) 3 6232 5012