Hi Bert, thank you very much for your suggestion! I will take a look at it soon!
Best Simon On Aug 9, 2013, at 4:45 PM, Bert Gunter <gunter.ber...@gene.com> wrote: > Simon: > > Have a look at the "proto" package for which there is a vignette. You > may find it suitable for your needs and less intimidating. > > Cheers, > Bert > > On Fri, Aug 9, 2013 at 7:40 AM, Simon Zehnder <szehn...@uni-bonn.de> wrote: >> 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. > > > > -- > > Bert Gunter > Genentech Nonclinical Biostatistics > > Internal Contact Info: > Phone: 467-7374 > Website: > http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm ______________________________________________ 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.