[Rd] Question about copying reference objects using the initialize method

Aleix Ruiz de Villa aleixrvr.info at gmail.com
Wed Nov 2 16:16:31 CET 2011


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?

Thanks again!

2011/11/1 Martin Morgan <mtmorgan at 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 at 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
>



More information about the R-devel mailing list