[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