From tplate at acm.org  Sat Mar 14 00:24:35 2009
From: tplate at acm.org (Tony Plate)
Date: Fri, 13 Mar 2009 17:24:35 -0600
Subject: [Rd] surprising behaviour of names<-
In-Reply-To: <49BAC763.5040104@idi.ntnu.no>
References: <49B67CB1.8060005@idi.ntnu.no>	<49B682F9.8050307@biostat.ku.dk>	<49B6E6D9.7010809@idi.ntnu.no>	<96A4BB14-D6EA-44B1-B524-6DB139F3A7F8@r-project.org>	<8CCAAAD3-919F-462F-A616-F4FDDB46D975@r-project.org>	<49B81186.4070107@idi.ntnu.no>	<20090312154008.56706f38@berwin-nus1>	<49B8D060.8090206@idi.ntnu.no>	<20090312173231.7a2929df@berwin-nus1>	<49B8DB8F.5030704@idi.ntnu.no>	<20090312213508.719afa73@berwin5>	<49B91A7E.50107@idi.ntnu.no>	<20090312231240.6a061f0b@berwin5>	<49B96FE7.2060705@idi.ntnu.no>	<20090313120309.7acb13e5@berwin-nus1>	<49BA38EB.3000004@idi.ntnu.no>	<49BAB3C5.9010401@acm.org>
	<49BAC763.5040104@idi.ntnu.no>
Message-ID: <49BAEB33.8040708@acm.org>

Wacek Kusnierczyk wrote:
> Tony Plate wrote:
>   
>> Wacek Kusnierczyk wrote:
>>     
>>> [snip]
>>> i just can't get it why the manual does not manifestly explain what
>>> 'names<-' does, and leaves you doing the guesswork you suggest.
>>>
>>>   
>>>       
>> I'm having trouble understanding the point of this discussion. 
>> Someone is calling a replacement function in a way that it's not meant
>> to be used, and is them complaining about it not doing what he thinks
>> it should, or about the documentation not describing what happens when
>> one does that?
>>     
>
> where is it written that the function is not meant to be used this way? 
> you get an example in the man page, showing precisely how it could be
> used that way.  it also explains the value of 'names<-':
>
> "
>  For 'names<-', the updated object.  (Note that the value of
>      'names(x) <- value' is that of the assignment, 'value', not the
>      return value from the left-hand side.)
> "
>
> it does speak of 'names<-' used in prefix form, and does not do it in
> any negative (discouraging) way.
>
>   
>> Is there anything incorrect or missing in the help page for normal
>> usage of the replacement function for 'names'? (i.e., when used in an
>> expression like 'names(x) <- ...')
>>     
>
> what is missing here in the first place is a specification of what
> 'normal' means.  as far as i can see from the man page, 'normal' does
> not exclude prefix use.  and if so, what is missing in the help page is
> a clear statement what an application of 'names<-' will do, in the sense
> of what a user may observe.
>   
Fair enough.  I looked at the help page for "names" after sending my 
email, and was surprised to see the following in the "DETAILS" section:

   "It is possible to update just part of the names attribute via the 
general rules: see the examples. This works because the expression there 
is evaluated as |z <- "names<-"(z, "[<-"(names(z), 3, "c2"))|. "

To me, this paragraph is far more confusing than enlightening, 
especially as also gives the impression that it's OK to use a 
replacement function in a functional form.  In my own personal opinion 
it would be a enhancement to remove that example from the documentation, 
and just say you can do things like 'names(x)[2:3] <- c("a","b")'.

I often use name replacement functions in a functional way, and because 
one can't use 'names<-' etc in this way, I define my own functions like 
the following:

set.names <- function(n,x) {names(x) <- n; x}

(and similarly for set.rownames(), set colnames(), etc.)

I would highly recommend you do this rather than try to use a call like 
"names<-"(x, ...).

-- Tony Plate

(I guess that if on the label of fridge there is a picture of a guy 
carrying it on his back, then Mr. Fridge-Racer might have some grounds 
for suing.)



[Rd] surprising behaviour of names<-
Tony Plate