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