From jmc at r-project.org  Mon Aug  6 00:54:43 2012
From: jmc at r-project.org (John Chambers)
Date: Sun, 05 Aug 2012 15:54:43 -0700
Subject: [Rd] setting invalid fields on reference classes sometimes
	allowed
In-Reply-To: <CAOQ5Nye6czTGueraiCFY8m9=KpY5wM8X23zCs4Nq2crsPLuO=g@mail.gmail.com>
References: <CAOQ5Nye6czTGueraiCFY8m9=KpY5wM8X23zCs4Nq2crsPLuO=g@mail.gmail.com>
Message-ID: <501EF9B3.7000706@r-project.org>

This doesn't seem to have anything to do with reference classes but 
rather is deep in  the evaluator.  At least when set up in the simple 
form of your example, the $<- method is never called.

For example:

>  Foo <- setRefClass("Foo")
> foo <- Foo$new()
> find("$<-")
[1] "package:base"
> debug(base::`$<-`)
> foo$a <- 1

Other variants on this seem still not to call the replacement function, 
and therefore not to dispatch the correct method.

I haven't had a chance to debug this at the required grubby level, but 
my guess is that the problem comes from base::`$<-` being a primitive, 
and not thinking it needs to check for methods.

Various kludgey workarounds will get the evaluator's attention and fix 
things.

> trace("$<-", sig = "Foo", browser)
Tracing specified method for function "$<-" in package "base"
[1] "$<-"
> untrace("$<-", sig = "Foo")
Untracing specified method for function "$<-" in package "base"
> foo$a <- 1
Error in envRefSetField(x, what, refObjectClass(x), selfEnv, value) :
   "a" is not a field in class "Foo"


Sigh.
   John

On 8/5/12 9:00 AM, Michael Lawrence wrote:
> I've found that reference class objects tend to behave like plain old
> environments wrt field access, unless a method on e.g. $<- is explicitly
> defined.
>
> Here is a code snippet:
>
> library(methods)
>
> Foo <- setRefClass("Foo")
> foo <- Foo$new()
> foo$a <- 2 # why does this succeed? not a valid field!
> ## set a silly $<- method
> setReplaceMethod("$", "Foo", function(x, name, value) {
>    callNextMethod(x, "b", value)})
>
> foo$b <- 3
>
>
> At first, we can set the non-existent field "a" without any error (I don't
> think this is the intended behavior). Then we set a silly override on $<-
> and things start to behave as expected:
>
> Error in envRefSetField(x, what, refObjectClass(x), selfEnv, value) :
>    "b" is not a field in class "Foo"
>
> What am I doing wrong?
>
> Thanks,
> Michael
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>



[Rd] setting invalid fields on reference classes sometimes allowed
John Chambers