Peculiar behavior of attached objects
Sorry, but you mis-read the help page for `attach', and your explanation is poppycock.
d <- data.frame(y=10) attach(d) d$y <- 20 y
[1] 10
find("y")
[1] "d" There is no `new variable': you are still seeing the one in the database which is attached. As the help page clearly says, that is not changed but a copy in the global environment is. You can change the attached copy by direct use of assign():
assign("y", 30, pos=2)
y
[1] 30 but that does not change d. You can also detach and attach. If you find the R documentation terse (it can be) do cross-check the S documentation (and this point is in both Venables & Ripley books, too).
On Sat, 17 Aug 2002, Greg Hammett wrote:
I've just discovered R and think it is terrific. I quickly reproduced results with a few lines of R commands that 7 years ago I had to do with a larger fortran code and many calls to NAG routines. (I'm mostly a computational plasma physicist, but occasionally delve into statistical analysis of data.) But I've come accross a very peculiar behavior of attached objects that cost me hours of searching for a bug, and it would be nice if the R developers could implement a small change to make the language easier to use. The problem was originally buried in a much larger code, but I've boiled it down to a 6 line example: -----------
d <- data.frame(y=10) attach(d) d$y <- 20
----------- The online help for attach() warns not to assign to the short variable name "y", as that creates a new variable named "y" and the original variable "d$y" remains unchanged. So I assumed that I could assign to the fully qualified name "d$y", and indeed that successfully changed the value of d$y: -----------
d$y
[1] 20
y
[1] 10
ls()
[1] "d"
------------
However, unbeknownst to me at first, it also created a new variable "y"
that keeps the original value of "d$y" and no longer points to the
present value of "d$y$". Furthermore, this new variable "y" doesn't
show up in the list of objects reported by ls()! (This is unlike the
example given in help(attach), where the new variable "height" created
by the assignment shows up in the ls() object list.) If a user assumes
that "y" points to the present value of "d$y$, as the attach() command
usually does, he will have bugs that will be very hard to track down.
Although the new variable "y" is hidden from the ls() list of objects,
it will be removed by doing a detach("d") command:
-----------
detach("d")
y
Error: Object "y" not found ----------- I can't think of any good reason why R should behave like this. I've tried this same example in Splus, and was surprised to see that it has the same behavior, so I suppose R at least has compatible peculiarities. I understand that assigning to a short variable name when attach is operational is supposed to create a new variable instead of modifying the original:
d <- data.frame(y=10) attach(d) y <- 20 d$y
[1] 10 and that a lot of R code might have been written assuming this behavior so it probably shouldn't be changed at this point. But if one makes an assignment to a fully qualified long variable name, I can't think of any good reason for a new semi-hidden variable to be created. Thus I think that R should instead do the following:
d <- data.frame(y=10) attach(d) d$y <- 20 y
[1] 20
This seems to me to be a much more natural and intuitive behavior that
the user should expect. Compatibility issues may require adding a
switch to allow users to get the old behavior if they really wanted, but
I can't think of how any users could have relied on this undocumented
"feature"...
--------------------------------------------------------------
I'm new to R, so perhaps I'm missing something that could be explained
to me. If it is decided not to change R's behavior, then at the least
I suggest that the example given by help(attach) be extended by
appending the following:
attach(women)
women$height <- height*2.54 ## Don't try to do this either, as it
## will still create a new variable "height" with the original
## values of women$height. I.e., height no longer points to the
## present value of women$height:
sd(women$height-height) # shows 6.88709
## furthermore, this new variable is not listed by ls() and
## disappears after doing detach("women")
ls()
detach("women")
height # gives an error message
------------
Greg Hammett hammett at princeton.edu
Lecturer with rank of Professor,
Astrophysical Sciences, Princeton University
Principal Research Physicist,
Princeton Plasma Physics Laboratory
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._