[R] Peculiar behavior of attached objects

ripley@stats.ox.ac.uk ripley at stats.ox.ac.uk
Sat Aug 17 17:40:10 CEST 2002


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



More information about the R-help mailing list