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 <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 > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel