[Rd] surprising behaviour of names<-

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Fri Mar 13 11:43:55 CET 2009


Berwin A Turlach wrote:
>
>>     foo = function(arg) arg$foo = foo
>>
>>     e = new.env()
>>     foo(e)
>>     e$foo
>>       
>> are you sure this is pass by value?
>>     
>
> But that is what environments are for, aren't they?  

might be.

> And it is
> documented behaviour.  

sure!

> Read section 2.1.10 ("Environments") in the R
> Language Definition, 

haven't objected to that.  i object to your 'r uses pass by value',
which is only partially correct.

> in particular the last paragraph:
>
>   Unlike most other R objects, environments are not copied when 
>   passed to functions or used in assignments.  Thus, if you assign the
>   same environment to several symbols and change one, the others will
>   change too.  In particular, assigning attributes to an environment can
>   lead to surprises.
>
> [..]
>   
>> and actually, in the example we discuss, 'names<-' does *not* return
>> an updated *tmp*, so there's even less to entertain.  
>>     
>
> How do you know?  Are you sure?  Have you by now studied what goes on
> under the hood?
>   

yes, a bit.  but in this example, it's enough to look into *tmp* to see
that it hasn't got the names added, and since x does have names, names<-
must have returned a copy of *tmp* rather than *tmp* changed:
   
    x = 1
    tmp = x
    x = 'names<-'(tmp, 'foo')
    names(tmp)
    # NULL

you suggested that "One reads the manual, (...) one reflects and
investigates, ..." -- had you done it, you wouldn't have asked the question.



>   
>> for fun and more guesswork, the example could have been:
>>
>>     x = x
>>     x = 'names<-'(x, value=c('a', 'b'))
>>     
>
> But it is manifestly not written that way in the manual; and for good
> reasons since 'names<-' might have side effects which invokes in the
> last line undefined behaviour.  Just as in the equivalent C snippet
> that I mentioned.
>   

i just can't get it why the manual does not manifestly explain what
'names<-' does, and leaves you doing the guesswork you suggest.

vQ



More information about the R-devel mailing list