On 11/02/2011 08:16 AM, Aleix Ruiz de Villa wrote:
Martin,

thanks. So then I should use options (3) or (4). That's all. Is there
an efficient way to initialize arguments if I have a long list of
arguments? maybe using a 'list'? so that the header of the function is
displayed in a friendly style?

Hi -- I'm not really understanding your question.

Martin


Thanks again!

2011/11/1 Martin Morgan<mtmor...@fhcrc.org>:
On 10/31/2011 08:53 AM, Aleix Ruiz de Villa wrote:

Dears,

I have a question about copying reference objects using the initialize
method.

1) If the latter has no arguments, there is no problem to copy an object.

myClass = setRefClass("myClass", fields = list(value = "numeric") )

myClass$methods(initialize = function(...){

   value<<- 1

   callSuper(...)
})

newObject = myClass$new()
newObject$value = 2
copyObject = newObject$copy()
copyObject$value = 3
print(newObject$value)
print(copyObject$value)


2) However, if the initialize method has arguments, I get an error:

myClass = setRefClass("myClass", fields = list(value = "numeric") )
myClass$methods(initialize = function(extValue, ...){

   value<<- extValue

   callSuper(...)
})
newObject = myClass$new(extValue = 2)
copyObject = newObject$copy()

Error in .Object$initialize(...) :
   argument "extValue" is missing, with no default


I understand that copy() first builds another instance of the object
and then copies the fields. But it calls new without arguments...

3) One solution would be the initialize values by default

myClass = setRefClass("myClass", fields = list(value = "numeric") )

myClass$methods(initialize = function(extValue = 1, ...){

   value<<- extValue

   callSuper(...)
})

newObject = myClass$new(extValue = 2)
copyObject = newObject$copy()


But I have a long list of arguments, so this way would be a little
uncomfortable. On the other hand, I've been told that in OOP, the idea
of the initialise method is to use the minimum information to build
the oject. So passing a long list of arguments is not a good idea.


4) Another option is to first build the object and then set the parameters

myClass = setRefClass("myClass", fields = list(value = "numeric") )

myClass$methods(setPar = function(extValue = 1, ...){

   value<<- extValue

   return()
})

newObject = myClass$new()
newObject$setPar(extValue = 2)
copyObject = newObject$copy()


It works fine.

Anyway I am curious to know if there is any way to use the initialize
method with arguments that is not a problem with copy().

Hi Aleix --

 From ?setRefClass

          Initialization methods
          need some care in design, as they do for S4 classes. In
          particular, remember that others may subclass your class and
          pass through field assignments or other arguments.
          Therefore, your method should normally include ... as an
          argument, all other arguments should have defaults or check
          for missingness, and your method should pass all initialized
          values on via '$callSuper()' or '$initFields()' if you know
          that your superclasses have no initialization methods.

so it sounds like your initialize method arguments are expected to have
default values. My preferred signature would place the '...' first, so that
unnamed arguments (super-classes) are not unintentionally matched to named
arguments.

Martin



Thank!

Aleix Ruiz de Villa

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


--
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109

Location: M1-B861
Telephone: 206 667-2793



--
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109

Location: M1-B861
Telephone: 206 667-2793

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

Reply via email to