From berwin at maths.uwa.edu.au  Mon Mar 16 03:26:25 2009
From: berwin at maths.uwa.edu.au (Berwin A Turlach)
Date: Mon, 16 Mar 2009 10:26:25 +0800
Subject: [Rd] surprising behaviour of names<-
In-Reply-To: <49BD5E9D.1030601@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> <20090313234755.6f6e08c9@berwin5>
	<49BD5E9D.1030601@idi.ntnu.no>
Message-ID: <20090316102625.1d93ded4@berwin-nus1>

G'day Wacek,

On Sun, 15 Mar 2009 21:01:33 +0100
Wacek Kusnierczyk <Waclaw.Marcin.Kusnierczyk at idi.ntnu.no> wrote:

> Berwin A Turlach wrote:
> >
> > 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")
> >
> >   
> 
> to prove that i take you seriously, i have peeked into the code, and
> found that indeed there is a temporary binding for *tmp* made behind
> the scenes -- sort of. unfortunately, it is not done carefully enough
> to avoid possible interference with the user's code:
> 
> '*tmp*' = 0
> `*tmp*`
> # 0
> 
> x = 1
> names(x) = 'foo'
> `*tmp*`
> # error: object "*tmp*" not found
> 
> `*ugly*`

I agree, and I am a bit flabbergasted.  I had not expected that
something like this would happen and I am indeed not aware of anything
in the documentation that warns about this; but others may prove me
wrong on this.

> given that `*tmp*`is a perfectly legal (though some would say
> 'non-standard') name, it would be good if somewhere here a warning
> were issued -- perhaps where i assign to `*tmp*`, because `*tmp*` is
> not just any non-standard name, but one that is 'obviously' used
> under the hood to perform black magic.

Now I wonder whether there are any other objects (with non-standard)
names) that can be nuked by operations performed under the hood.  

I guess the best thing is to stay away from non-standard names, if only
to save the typing of back-ticks. :)

Thanks for letting me know, I have learned something new today.

Cheers,

	Berwin



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