From jmc@research.bell-labs.com  Mon Oct 14 13:59:43 2002
From: jmc@research.bell-labs.com (John Chambers)
Date: Mon, 14 Oct 2002 08:59:43 -0400
Subject: The class attribute on an environment seems buggy (PR#2159)
References: <200210132334.BAA05124@pubhealth.ku.dk>
Message-ID: <3DAABFBF.F7AEC086@research.bell-labs.com>

Any attribute of environments, not just the class, can be killed by
operating on the object "locally" in a function.

Example:

R> f <- function(x){ y <- x; attr(y, "foo") <- NULL; y}
R> ev <- new.env()
R> attr(ev, "foo") <- "bar"
R> ev
<environment: 0x8b515d4>
attr(,"foo")
[1] "bar"
R> f(ev)
<environment: 0x8b515d4>
R> ev
<environment: 0x8b515d4>

The reason is that the C routine `duplicate' does not duplicate an
environment  OR its attributes.

I was bitten by this trying to use environments as reference objects in
the Omegahat OOP package.

Would there be a problem with a "fix" in which the environment was left
unduplicated, but environments with attributes are "duplicated" by
creating a copy of the attribute list, but with the copy still pointing
to the same environment?

If that is not possible, it would be good to have another datatype that
had roughly those properties.  Otherwise, it's difficult to build on
this datatype in designing new classes.

(The same issue applies to other types, such as external pointers.)

hb@maths.lth.se wrote:
> 
> Full_Name: Henrik Bengtsson
> Version: 1.6.0, 1.5.1
> OS: WinXP Pro
> Submission from: (NULL) (128.250.252.82)
> 
> The following example, which I tested on both R v1.5.1 and R v1.6.0 on WinXP
> Pro, shows the problem I encountered when trying to use the class attribute of
> an environment:
> 
> # Define method print() for class Environment
> C
> 
> print(e)
> # gives:
> # [1] "An Environment!"
> 
> # Exit [R]
> q(save="yes")
> 
> When restarting [R] and loading the previous workspace something goes wrong(?):
> % R
> 
> print(e)
> # gives:
> # <environment: 01BE52F4>
> # attr(,"class")
> # [1] "Environment"
> 
> print(class(e))
> # gives:
> # [1] "Environment"
> 
> print(unclass(e))
> # gives:
> # <environment: 01BE52F4>
> # attr(,"class")
> # [1] "Environment"
> 
> str(e)
> # gives because of the malfunctioning unclass():
> # Class 'Environment' Class 'Environment' Class 'Environment' Class
> 'Environment'
> # Class 'Environment' Class 'Environment' Class 'Environment' Class
> 'Environment'
> # Class 'Environment' Class 'Environment' Class 'Environment' ...
> 
> Note how unclass(e) does not work properly. More importantly, it the
> S3/UseMethod() method dispatching get confused and won't recognize the class
> attribute.
> 
> Cheers
> 
> Henrik Bengtsson
> 
> Home: 201/445 Royale Parade, Parkville
> Office: Bioinformatics, WEHI, Parkville
> +61 (0)412 269 734 (cell), +61 (0)3 9387 791 (home), +61 (0)3 9345 2324 +(lab)
> hb@maths.lth.se, http://www.maths.lth.se/~hb/
> Time zone: +10h UTC (Sweden +2h UTC, Calif. -7h UTC)
> 
> -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
> r-devel 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-devel-request@stat.math.ethz.ch
> _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

-- 
John M. Chambers                  jmc@bell-labs.com
Bell Labs, Lucent Technologies    office: (908)582-2681
700 Mountain Avenue, Room 2C-282  fax:    (908)582-3340
Murray Hill, NJ  07974            web: http://www.cs.bell-labs.com/~jmc
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel 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-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


The class attribute on an environment seems buggy (PR#2159)
John Chambers