[Rd] surprising behaviour of names<-

Berwin A Turlach berwin at maths.uwa.edu.au
Thu Mar 12 08:40:08 CET 2009


On Wed, 11 Mar 2009 20:31:18 +0100
Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no> wrote:

> Simon Urbanek wrote:
> >
> > On Mar 11, 2009, at 10:52 , Simon Urbanek wrote:
> >
> >> Wacek,
> >>
> >> Peter gave you a full answer explaining it very well. If you really
> >> want to be able to trace each instance yourself, you have to learn
> >> far more about R internals than you apparently know (and Peter
> >> hinted at that). Internally x=1 an x=c(1) are slightly different
> >> in that the former has NAMED(x) = 2 whereas the latter has
> >> NAMED(x) = 0 which is what causes the difference in behavior as
> >> Peter explained. The reason is that c(1) creates a copy of the 1
> >> (which is a constant [=unmutable] thus requiring a copy) and the
> >> new copy has no other references and thus can be modified and
> >> hence NAMED(x) = 0.
> >>
> >
> > Errata: to be precise replace NAMED(x) = 0 with NAMED(x) = 1 above
> > -- since NAMED(c(1)) = 0 and once it's assigned to x it becomes
> > NAMED(x) = 1 -- this is just a detail on how things work with
> > assignment, the explanation above is still correct since
> > duplication happens conditional on NAMED == 2.
> 
> i guess this is what every user needs to know to understand the
> behaviour one can observe on the surface? 

Nope, only users who prefer to write '+'(1,2) instead of 1+2, or
'names<-'(x, 'foo') instead of names(x)='foo'.

Attempting to change the name attribute of x via 'names<-'(x, 'foo')
looks to me as if one relies on a side effect of the function
'names<-'; which, in my book would be a bad thing.  I.e. relying on side
effects of a function, or writing functions with side effects which are
then called for their side-effects;  this, of course, excludes
functions like plot() :)  I never had the need to call 'names<-'()
directly and cannot foresee circumstances in which I would do so.

Plenty of users, including me, are happy using the latter forms and,
hence, never have to bother with understanding these implementation
details or have to bother about them.  

Your mileage obviously varies, but that is when you have to learn about
these internal details.  If you call functions because of their
side-effects, you better learn what the side-effects are exactly.

Cheers,

	Berwin



More information about the R-devel mailing list