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() [EMAIL PROTECTED] <<- 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, [EMAIL PROTECTED] 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 > [EMAIL PROTECTED] <- 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@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: [EMAIL PROTECTED] Iowa City, IA 52242 WWW: http://www.stat.uiowa.edu
______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel