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.

Reply via email to