Good diagnoses.

This thread brought up a point or two that needed some fixes to the documentation and code. They should be in r-devel and 2.12 patched (from rev. 53471).

Briefly:

- Initialization methods should take account of future subclasses to your class by including and passing on the ... argument, so that additional fields can be specified. Discussed briefly now in the $new(...) section of ?ReferenceClasses.

- The InitFields() method is fine but was an early kludge when callSuper() didn't work for initialize(). To allow for the case that your class has a superclass with an initialize() method, use the callSuper() approach. There is an example now in the documentation.

John

On 10/28/10 10:55 AM, Jon Clayden wrote:
?ReferenceClasses says "Reference methods can not themselves be
generic functions; if you want additional function-based method
dispatch, write a separate generic function and call that from the
method". So I think you'd need to take that approach in your
"initialize" method.

Hope this helps,
Jon


On 28 October 2010 18:25, Daniel Lee<bear...@alum.mit.edu>  wrote:
Thank you. Your example really clarifies what the $initialize(...) function
is supposed to do.

Do you know if there is a straightforward way to dispatch the $new(...)
method based on the signature of the arguments? I am thinking along the
lines of S4 methods with valid signatures.

Thanks again for the example.


On 10/28/2010 12:12 PM, Jon Clayden wrote:

Sorry - you don't need to assign the value of initFields(). I was
going to do it in two lines but then realised one was enough... :)

TestClass<- setRefClass ("TestClass",
        fields = list (text = "character"),
        methods = list (
                initialize = function (text) {
initFields(text=paste(text,"\n")) },
                print = function ()  { cat(text) } )
)

All the best,
Jon


On 28 October 2010 15:13, Daniel Lee<bear...@alum.mit.edu>    wrote:

Is it possible to override the $new(...) in the reference class
generator? I
have tried adding a "new" method to the methods of the class, but that is
obviously not correct. I have also tried adding it to the class
generator,
but the class generator still uses the default constructor.

As a simple example, this is the current interface:
TestClass<- setRefClass ("TestClass",
        fields = list (text = "character"),
        methods = list (
                print = function ()  {cat(text)})
)
test<- TestClass$new (text="Hello World")
test$print()

I would like to override $new(...) to be something like (add a "\n" to
the
end of the input, no need to specify input fields):
TestClass$methods (new = function (text) {
            text<- paste (text, "\n")
            methods:::new (def, text=text)
        })

The constructor would then be:
test<- TestClass$new ("Hello World")

This is a subtle, but useful change. I have also tried adding to
TestClass a
method $newInstance(text), but that was not successful. If this is not
possible, could we consider augmenting the Reference Class interface to
include constructors?

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel



______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to