Re: [R] R.oo question

From: Henrik Bengtsson <hb_at_stat.berkeley.edu>
Date: Sat 27 May 2006 - 08:32:27 EST

On 5/26/06, Omar Lakkis <uofiowa@gmail.com> wrote:
> This is a simple R.oo question but I, thankfully, hope that someone
> would explain it to me so I would better understand this work frame.
> I create this class:
>
> setConstructorS3("MyExample", function(param=0) {
> print(paste("called with param=", param))
> extend(Object(), "MyExample",
> .param = param
> );
> })
>
> >From what is printed out, who made the second call to the class with
> the default param?
>
> > MyExample(1)
> [1] "called with param= 1"
> [1] "called with param= 0" # <- this is line in question
> [1] "MyExample: 0x02831708"

That is because of a new US government rule requiring that one instance of every R.oo class is forwarded to the NSA.

Seriously, you will see that this happens once and only once for each class defined this way and it normally happens when you create your first instance (otherwise before that). The first call to the constructor creates a so called static instance of the class. The static instance is for instance used when you type 'MyExample' to get the API coupled to class MyExample. Another example:

> Object

Object
  public $(name)
  public $<-(name, value)
  public [[(name)
  ...
  public objectSize(...)
  public print(...)
  public save(file=NULL, path=NULL, compress=TRUE, ...) }

Technical details: The static instance is not always needed, but quite often. If needed, it has to be create at some stage and I found that having extend() to do this is quite convenient. The alternative would be to let you do it explicitly, e.g. getStaticInstance(Object). Note that there is no central registry/database keeping track of the classes defined by R.oo/Object, but all is just plain S3 classes making use of the S3/UseMethod dispatching mechanisms - that's all.

There is a low-level way to figure out if the call to the constructor is for the static instance or not, but normally it is easier not to output anything in the constructor. If you want to know the low-level way, I'll have have to get back to, because I don't know it off the top of my head. I might provide a method for this if there is a need for it, e.g. hasStaticInstance(MyExample).

Cheers

Henrik
(the author)

> ______________________________________________
> R-help@stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
>
>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Sat May 27 08:36:22 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sat 27 May 2006 - 10:11:02 EST.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.