[Rd] Bug in copying of S4 objects (PR#8112)
Luke Tierney
luke at stat.uiowa.edu
Fri Sep 2 05:33:26 CEST 2005
I've poked in the source a bit. Here are some notes in case someone
has time to look into this.
The main internal difference between <<- and <- for complex
assignments is that <- calls EnsureLocal which calls duplicate on the
value of the left hand side value if NAMED == 2. In principle I don't
tink this should be necessary, but it means that assignment functions
called for <- assignments will not see NAMED == 2. This protects
agains internal assignment functions that destructively modify without
looking at NAMED, which is what @<- and slot<- do. But <<- does not
do this defensive duplicating, hence the problem with <<-. Similar
problems occur if structures contain environments used to implement
reference behaviour since the copying stops at the environment.
The appropriate fix is to insure that @<- and slot<- respect NAMED and
duplicate when NAMED == 2, as attr<- does. This will require either
making @<- and slot<- into SPECIALSXP's or some sort of
underhandedness to allow them to remain closures. One possibility
might be to define a SPECIALSXP that looks at the NAMED value of the
object argument (by inspecting the promise before it is forced). This
can then be passed into the internal R_set_slot function via .Call.
luke
On Thu, 1 Sep 2005, Luke Tierney wrote:
> Another variant of what is probably the same issue:
>
> > setClass("foo", representation(a = "numeric"))
> [1] "foo"
> > f <- function() x at a <<- 2
> > x <- new("foo",a=1)
> > y <- x
> > f()
> > x
> An object of class âfooâ
> Slot "a":
> [1] 2
>
> > y
> An object of class âfooâ
> Slot "a":
> [1] 2
>
> luke
>
> On Wed, 31 Aug 2005, murdoch at stats.uwo.ca wrote:
>
>> If I have an S4 object, and I make a copy, changes to the original
>> aren't reflected in the copy:
>>
>> > setClass("foo", representation(slot="numeric"))
>> > x <- new("foo", slot=1)
>> > y <- x
>> > x at slot <- 2
>> > y
>> An object of class "foo"
>> Slot "slot":
>> [1] 1
>>
>> This is as it should be. However, if I call the slot assignment
>> function in a funny way, y *does* receive the changes:
>>
>> > x <- new("foo", slot=1)
>> > y <- x
>> > assign("x", "@<-"(x, "slot", 2))
>> > y
>> An object of class "foo"
>> Slot "slot":
>> [1] 2
>>
>> This happens in the current R-devel in Windows, and R-patched too.
>>
>> > version
>> _
>> platform i386-pc-mingw32
>> arch i386
>> os mingw32
>> system i386, mingw32
>> status Under development (unstable)
>> major 2
>> minor 2.0
>> year 2005
>> month 08
>> day 31
>> svn rev 35467
>> language R
>>
>> Duncan Murdoch
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
>
--
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa Phone: 319-335-3386
Department of Statistics and Fax: 319-335-3017
Actuarial Science
241 Schaeffer Hall email: luke at stat.uiowa.edu
Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
More information about the R-devel
mailing list