From berwin at maths.uwa.edu.au  Fri Mar 13 16:47:55 2009
From: berwin at maths.uwa.edu.au (Berwin A Turlach)
Date: Fri, 13 Mar 2009 23:47:55 +0800
Subject: [Rd] surprising behaviour of names<-
In-Reply-To: <49BA38EB.3000004@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>
Message-ID: <20090313234755.6f6e08c9@berwin5>

On Fri, 13 Mar 2009 11:43:55 +0100
Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no> wrote:

> Berwin A Turlach wrote:
>
> > And it is documented behaviour.  
> 
> sure!

Glad to see that we agree on this.

> > 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.

Well, I used qualifiers and did not stated it categorically. 
 
> >> 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

Indeed, if you type these two commands on the command line, then it is
not surprising that a copy of tmp is returned since you create a
temporary object that ends up in the symbol table and persist after the
commands are finished.

Obviously, assuming that R really executes 
	*tmp* <- x
	x <- "names<-"('*tmp*', value=c("a","b"))
under the hood, in the C code, then *tmp* does not end up in the symbol
table and does not persist beyond the execution of 
	names(x) <- c("a","b")

This looks to me as one of the situations where a value of 1 is used
for the named field of some of the objects involves so that a copy can
be avoided.  That's why I asked whether you looked under the hood.

> you suggested that "One reads the manual, (...) one reflects and
> investigates, ..."

Indeed, and I am not giving up hope that one day you will master this
art.

> -- had you done it, you wouldn't have asked the  question.

Sorry, I forgot that you have a tendency to interpret statements
extremely verbatim and with little reference to the context in which
they are made.  I will try to be more explicit in future.

> >> 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.

As I said before, patched to documentation are also welcome.

Best wishes,
	
	Berwin



[Rd] surprising behaviour of names<-
Berwin A Turlach