From ggrothendieck at gmail.com  Wed Jul  5 18:39:59 2006
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Wed, 5 Jul 2006 12:39:59 -0400
Subject: [Rd] attributes of environments
In-Reply-To: <Pine.LNX.4.64.0607050911380.32591@homer22.u.washington.edu>
References: <971536df0607042012h43eb1581n418e9cddfe3a51bb@mail.gmail.com>
	<Pine.LNX.4.64.0607050857440.32591@homer22.u.washington.edu>
	<971536df0607050910w2a35e6ecxef5dec5c41a781e3@mail.gmail.com>
	<Pine.LNX.4.64.0607050911380.32591@homer22.u.washington.edu>
Message-ID: <971536df0607050939r11dbdb93g6186550477e78d92@mail.gmail.com>

On 7/5/06, Thomas Lumley <tlumley at u.washington.edu> wrote:
> On Wed, 5 Jul 2006, Gabor Grothendieck wrote:
>
> > On 7/5/06, Thomas Lumley <tlumley at u.washington.edu> wrote:
> >> On Tue, 4 Jul 2006, Gabor Grothendieck wrote:
> >>
> >> > In the code below, e is an environment which we copy to f and then
> >> > add attributes to e.  Now f winds up with the same attributes.
> >> >
> >> > In other words it seems that the attributes are a property of the
> >> > environment itself and not of the variable.  Thus it appears we
> >> > cannot have two environment variables that correspond to the
> >> > original environment but with different attributes.
> >>
> >> No, we can't. The two variables are references to the same environment, so
> >> they are the same.
> >>
> >> If you want the attributes to be copies rather than references then create
> >> a list with the environment as an element and put the attributes on the
> >> list.
> >
> > I realize that that is how it works but what I was really wondering was
> > should it work that way?
> >
>
> I think it really should (and this question has come up before).  If you
> do
>    e<-environment()
>    f<-e
>
> then there is only one object that f and e both point to. Now, since such
> things as S3 class and matrix dimension are implemented as attributes I
> think you really have to consider the attributes as part of the object
> [which is also how they are implemented, of course].  So if e and f are
> the same object they should have the same attributes.

I don't think this follows since in the other cases modifying the
object also creates a copy.

>
> Another reasonable position would be to disallow attributes on
> environments (as we do with NULL, another reference object), but that
> seems extreme.

I don't think that that would solve it because there is still the issue
of the class attribute which you can't disallow.

In fact consider this:

e <- new.env()
f <- e
class(f) <- c("myenv", "environment")
F <- function(x) UseMethod("F")
F.environment <- function(x) 1
F.myenv <- function(x) 2
F(e) # 2
F(f) # 2

The point is that subclassing does not work properly with environments
yet subclasses of the environment class should be possible since R
is supposed to be OO and I see no valid reason for exclusing environments
for this.  I guess in this discussion I am coming to the realization that
this issue really is a problem with the current way R works.



[Rd] attributes of environments
Gabor Grothendieck