Please read the proto vignette before asking further questions about
it. It is an alternative to/version of OOP different from S3 and S4.

-- Bert

On Fri, Aug 9, 2013 at 8:13 AM, Simon Zehnder <szehn...@uni-bonn.de> wrote:
> Hi Martin,
>
> is proto in S3?
>
> I will take a look first at the simple package EBImage.
>
> Thank you very much for the suggestions!
>
> Best
>
> Simon
>
>
> On Aug 9, 2013, at 5:01 PM, Martin Morgan <mtmor...@fhcrc.org> wrote:
>
>> On 08/09/2013 07:45 AM, Bert Gunter 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.
>>
>> Won't help much with S4, though! Some answers here
>>
>> http://stackoverflow.com/questions/5437238/which-packages-make-good-use-of-s4-objects
>>
>> including from Bioconductor simple class in EBImage, the advanced IRanges 
>> package and the 'toy' StudentGWAS.
>>
>> Martin
>>
>>>
>>> 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.
>>>
>>>
>>>
>>
>>
>> --
>> 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
>



-- 

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