[Rd] surprising behaviour of names<-

Simon Urbanek simon.urbanek at r-project.org
Wed Mar 11 15:52:27 CET 2009


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.

Cheers,
Simon


On Mar 10, 2009, at 18:16 , Wacek Kusnierczyk wrote:

> i got an offline response saying that my original post may have not  
> been
> clear as to what the problem was, essentially, and that i may need to
> restate it in words, in addition to code.
>
> the problem is:  the performance of 'names<-' is incoherent, in that  
> in
> some situations it acts in a functional manner, producing a copy of  
> its
> argument with the names changed, while in others it changes the object
> in-place (and returns it), without copying first.  your explanation
> below is of course valid, but does not seem to address the issue.  in
> the examples below, there is always (or so it seems) just one  
> reference
> to the object.
>
> why are the following functional:
>
>    x = 1;  'names<-'(x, 'foo'); names(x)
>    x = 'foo'; 'names<-'(x, 'foo');  names(x)
>
> while these are destructive:
>
>    x = c(1);  'names<-'(x, 'foo'); names(x)
>    x = c('foo'); 'names<-'(x, 'foo');  names(x)
>
> it is claimed that in r a singular value is a one-element vector, and
> indeed,
>
>    identical(1, c(1))
>    # TRUE
>    all.equal(is(1), is(c(1)))
>    # TRUE
>
> i also do not understand the difference here:
>
>    x = c(1); 'names<-'(x, 'foo'); names(x)
>    # "foo"
>    x = c(1); names(x); 'names<-'(x, 'foo'); names(x)
>    # "foo"
>    x = c(1); print(x); 'names<-'(x, 'foo'); names(x)
>    # NULL
>    x = c(1); print(c(x)); 'names<-'(x, 'foo'); names(x)
>    # "foo"
>
> does print, but not names, increase the reference count for x when
> applied to x, but not to c(x)?
>
> if the issue is that there is, in those examples where x is left
> unchanged, an additional reference to x that causes the value of x  
> to be
> copied, could you please explain how and when this additional  
> reference
> is created?
>
>
> thanks,
> vQ
>
>
>
>
> Peter Dalgaard wrote:
>>
>>> is there something i misunderstand here?
>>>
>>
>> Only the ideology/pragmatism... In principle, R has call-by-value
>> semantics and a function does not destructively modify its  
>> arguments(*),
>> and foo(x)<-bar behaves like x <- "foo<-"(x, bar). HOWEVER, this has
>> obvious performance repercussions (think x <- rnorm(1e7); x[1] <-  
>> 0), so
>> we do allow destructive modification by replacement functions,  
>> PROVIDED
>> that the x is not used by anything else. On the least suspicion that
>> something else is using the object, a copy of x is made before the
>> modification.
>>
>> So
>>
>> (A) you should not use code like y <- "foo<-"(x, bar)
>>
>> because
>>
>> (B) you cannot (easily) predict whether or not x will be modified
>> destructively
>>
>> --------
>> (*) unless you mess with match.call() or substitute() and the like.  
>> But
>> that's a different story.
>>
>>
>>
>
>
> -- 
> -------------------------------------------------------------------------------
> Wacek Kusnierczyk, MD PhD
>
> Email: waku at idi.ntnu.no
> Phone: +47 73591875, +47 72574609
>
> Department of Computer and Information Science (IDI)
> Faculty of Information Technology, Mathematics and Electrical  
> Engineering (IME)
> Norwegian University of Science and Technology (NTNU)
> Sem Saelands vei 7, 7491 Trondheim, Norway
> Room itv303
>
> Bioinformatics & Gene Regulation Group
> Department of Cancer Research and Molecular Medicine (IKM)
> Faculty of Medicine (DMF)
> Norwegian University of Science and Technology (NTNU)
> Laboratory Center, Erling Skjalgsons gt. 1, 7030 Trondheim, Norway
> Room 231.05.060
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



More information about the R-devel mailing list