[Rd] Global assignment with S4 objects in R 1.9.0 beta 
    Torsten Hothorn 
    Torsten.Hothorn at rzmail.uni-erlangen.de
       
    Mon Mar 29 10:22:41 CEST 2004
    
    
  
Hi,
some change during the last 10 days breaks code where slots of an
object are changed globally:
setClass("mylist", contains = "list")
setClass("dummy", representation = representation(
    a = "mylist"))
foo1 = function(i, x) {
    mydummy at a[[i]] <<- x		### change a slot
}
foo2 = function() {			### define an object
    mydummy <<- new("dummy")
    a <- vector(length = 10, mode = "list")
    class(a) <- "mylist"
    mydummy at a <<- a
    for (i in 1:10) foo1(i, i+1)
    mydummy
}
try(thisdummy <- foo2())
unlist(thisdummy at a)
This one works as expected
R : Copyright 2004, The R Foundation for Statistical Computing
Version 1.9.0 alpha (2004-03-18), ISBN 3-900051-00-3
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for a HTML browser interface to help.
Type 'q()' to quit R.
> invisible(options(echo = TRUE))
>
> setClass("mylist", contains = "list")
[1] "mylist"
>
> setClass("dummy", representation = representation(
+     a = "mylist"))
[1] "dummy"
>
> foo1 = function(i, x) {
+     mydummy at a[[i]] <<- x
+ }
>
> foo2 = function() {
+     mydummy <<- new("dummy")
+     a <- vector(length = 10, mode = "list")
+     class(a) <- "mylist"
+     mydummy at a <<- a
+     for (i in 1:10) foo1(i, i+1)
+     mydummy
+ }
>
> try(thisdummy <- foo2())
> unlist(thisdummy at a)
 [1]  2  3  4  5  6  7  8  9 10 11
> proc.time()
[1] 1.99 0.06 2.03 0.00 0.00
>
and with yesterdays R-devel it fails
R : Copyright 2004, The R Foundation for Statistical Computing
Version 1.9.0 beta (2004-03-28), ISBN 3-900051-00-3
R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.
R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R in publications.
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for a HTML browser interface to help.
Type 'q()' to quit R.
R> invisible(options(echo = TRUE))
R>
R> setClass("mylist", contains = "list")
[1] "mylist"
R>
R> setClass("dummy", representation = representation(
+     a = "mylist"))
[1] "dummy"
R>
R> foo1 = function(i, x) {
+     mydummy at a[[i]] <<- x
+ }
R>
R> foo2 = function() {
+     mydummy <<- new("dummy")
+     a <- vector(length = 10, mode = "list")
+     class(a) <- "mylist"
+     mydummy at a <<- a
+     for (i in 1:10) foo1(i, i+1)
+     mydummy
+ }
R>
R> try(thisdummy <- foo2())
Error in foo1(i, i + 1) : Object "*tmp*" not found
R> unlist(thisdummy at a)
Error in unlist(thisdummy at a) : Object "thisdummy" not found
Execution halted
Best,
Torsten
    
    
More information about the R-devel
mailing list