Hi Martin, thank you very much for this profound answer! Your added design advice is very helpful, too!
For the 'simple example': Sometimes I am still a little overwhelmed from a certain setting in the code and my ideas how I want to handle a process. But I learn from session to session. In future I will also span the lines more than 80 columns. I am used to the indent in my vim editor. I have one further issue: I do know, that you are one of the leading developers of the bioconductor package which uses (as far as I have read) extensively OOP in R. Is there a package you could suggest to me to learn from by reading and understanding the code? Where can I find the source code? Best Simon On Aug 8, 2013, at 10:00 PM, Martin Morgan <mtmor...@fhcrc.org> wrote: > On 08/04/2013 02:13 AM, Simon Zehnder wrote: >> So, I found a solution: First in the "initialize" method of class C coerce >> the C object into a B object. Then call the next method in the list with the >> B class object. Now, in the "initialize" method of class B the object is a B >> object and the respective "generateSpec" method is called. Then, in the >> "initialize" method of C the returned object from "callNextMethod" has to be >> written to the C class object in .Object. See the code below. >> >> setMethod("initialize", "C", function(.Object, value) {.Object@c <- value; >> object <- as(.Object, "B"); object <- callNextMethod(object, value); >> as(.Object, "B") <- object; .Object <- generateSpec(.Object); >> return(.Object)}) >> >> This setting works. I do not know though, if this setting is the "usual" way >> such things are done in R OOP. Maybe the whole class design is >> disadvantageous. If anyone detects a mistaken design, I am very thankful to >> learn. > > Hi Simon -- your 'simple' example is pretty complicated, and I didn't really > follow it in detail! The code is not formatted for easy reading (e.g., lines > spanning no more than 80 columns) and some of it (e.g., generateSpec) might > not be necessary to describe the problem you're having. > > A good strategy is to ensure that 'new' called with no arguments works (there > are other solutions, but following this rule has helped me to keep my classes > and methods simple). This is not the case for > > new("A") > new("C") > > The reason for this strategy has to do with the way inheritance is > implemented, in particular the coercion from derived to super class. Usually > it is better to provide default values for arguments to initialize, and to > specify arguments after a '...'. This means that your initialize methods will > respects the contract set out in ?initialize, in particular the handling of > unnamed arguments: > > ...: data to include in the new object. Named arguments > correspond to slots in the class definition. Unnamed > arguments must be objects from classes that this class > extends. > > I might have written initialize,A-method as > > setMethod("initialize", "A", function(.Object, ..., value=numeric()){ > .Object <- callNextMethod(.Object, ..., a=value) > generateSpec(.Object) > }) > > Likely in a subsequent iteration I would have ended up with (using the > convention that function names preceded by '.' are not exported) > > .A <- setClass("A", representation(a = "numeric", specA = "numeric")) > > .generateSpecA <- function(a) { > 1 / a > } > > A <- function(a=numeric(), ...) { > specA <- .generateSpecA(a) > .A(..., a=a, specA=specA) > } > > setMethod(generateSpec, "A", function(object) { > .generateSpecA(object@a) > }) > > ensuring that A() returns a valid object and avoiding the definition of an > initialize method entirely. > > Martin > >> >> Best >> >> Simon >> >> >> On Aug 3, 2013, at 9:43 PM, Simon Zehnder <simon.zehn...@googlemail.com> >> wrote: >> >>> setMethod("initialize", "C", function(.Object, value) {.Object@c <- value; >>> .Object <- callNextMethod(.Object, value); .Object <- >>> generateSpec(.Object); return(.Object)}) >> >> ______________________________________________ R-help@r-project.org mailing >> list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting >> guide http://www.R-project.org/posting-guide.html and provide commented, >> minimal, self-contained, reproducible code. >> > > > -- > Computational Biology / Fred Hutchinson Cancer Research Center > 1100 Fairview Ave. N. > PO Box 19024 Seattle, WA 98109 > > Location: Arnold Building M1 B861 > Phone: (206) 667-2793 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.