[Rd] Reference Classes: Accessing methods via [[...]], bug?

John Chambers jmc at r-project.org
Mon May 2 00:09:37 CEST 2011

Yes, as presented on that site it makes a little more sense:

"While experimenting with the new reference classes in R I noticed some 
odd behaviour if you use the "[[ ]]" notation for methods 
(X[["doSomething"]] instead of X$doSomething). This notation works for 
fields, but I initially thought it wouldn't work for methods until I 
found that if you execute "class(X$doSomething)" you can then use "[[ 
]]" afterwards. The simple example below illustrates the point."

For reference classes, "[[" is not meant to be used either for fields or 
methods.  That it "works" at all is an artifact of the implementation 
using environments.  And arguably the failure to throw an error in that 
circumstance is a bug.

Please use the API as described in the ?ReferenceClasses documentation. 
  These are encapsulated methods, in the usual terminology, with the 
operator "$" playing the role normally assigned to "." in other languages.

A separate  but related issue:  It is possible to define S4 methods for 
reference classes, as discussed in a previous thread, arguably also an 
artifact in that a reference class is implemented as an S4 class of the 
same name.  These are functional methods, associated with a generic 
function, and so outside the encapsulation paradigm.

It would be interesting to get some experience and opinions on whether 
this is a good idea or not.  It breaks encapsulation, in that the 
behavior of the class can no longer be inferred from the class 
definition alone.  On the other hand, it is convenient and relates to 
"operator overloading" in some other languages.


On 4/30/11 7:54 PM, Hadley Wickham wrote:
> If this message is garbled for anyone else, the original question on
> stackoverflow is here:
> http://stackoverflow.com/questions/5841339/using-notation-for-reference-class-methods
> Hadley
> On Sat, Apr 30, 2011 at 11:35 AM, Chad Goymer<chad.goymer at hotmail.co.uk>  wrote:
>> I've been trying to use methods for reference classes via the notation "[[...]]" (X[["doSomething"]] rather than X$doSomething), but it failed to work. However, I did find that if you use the usual "$" notation first, "[[...]]" can be used afterwards. The following simple example illustrates the point:
>>> setRefClass("Number", +   fields = list(+     value = "numeric"+   ),+   methods = list(+     addOne = function() {+       value<<- value + 1+     }+   )+ )>  X<- new("Number", value = 1)>  X[["value"]][1] 1
>>> X[["addOne"]]()Error: attempt to apply non-function>  class(X[["addOne"]]) # NULL[1] "NULL"
>>> class(X$addOne)[1] "refMethodDef"attr(,"package")[1] "methods"
>>> X[["addOne"]]()>  X[["value"]][1] 2>  class(X[["addOne"]])[1] "refMethodDef"attr(,"package")[1] "methods"
>> Is this a bug?
>> Chad Goymer
>>         [[alternative HTML version deleted]]
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel

More information about the R-devel mailing list