From osklyar at ebi.ac.uk  Tue Jan  8 12:17:42 2008
From: osklyar at ebi.ac.uk (Oleg Sklyar)
Date: Tue, 08 Jan 2008 11:17:42 +0000
Subject: [Rd] S3 vs S4 for a simple package
In-Reply-To: <u8x31z5br.fsf@insightful.com>
References: <CB8F09FF-2B71-4A19-BA7D-61CF056E4C22@noc.soton.ac.uk>
	<u8x31z5br.fsf@insightful.com>
Message-ID: <47835BD6.5060001@ebi.ac.uk>

> Would you like existing functions such as mean, range, sum,
> colSums, dim, apply, length, and many more to operate on the array of
> numbers?  If so use an S3 class.

The above is misleading as 'setClass("NewArray", [additional structures 
go in here], contains="array")' will give the NewArray all the 
functionality of "array" with mean, range, sum, colSums, dim, apply, 
length etc *and* [<- [[<- supported out of the box! You basically need 
only to write [, [[ to ensure that returns are of the NewClass!

> If you would like to effectively disable such functions, to prevent
> them from working on the object unless you write a method that specifies
> exactly how the function should operate on the class, then either
> use an S4 class, or an S3 class where the array is one component of
> a list.

This is very slow when used with [, [[ operators on that element

> An S3 class also allows for flexibility - you can add attributes,
> or list components, without breaking things.

That's true, but then what is the purpose of a class but the rigid 
structure?

> As for reassurance - I use S3 classes for almost everything, happily.
> The one time I chose to use an S4 class I later regretted it.  This
> was for objects containing multiple imputations, where I wanted to
> prevent functions like mean() from working on the original data,
> without filling in imputations.  The regret was because we later
> realized that in some cases we wanted to add a "call" attribute or
> component/slot so that update() would work.  If it had been an S3
> object we could have done so, but as an S4 object we would have broken
> existing objects of the class.
> 
> Tim Hesterberg
> Disclaimer - this is my personal opinion, not my employer's.
> 
>> I am writing a package and need to decide whether to use S3 or S4.
>>
>> I have a single class, "multipol"; this needs methods for "[" and "[<-"
>> and I also need a print (or show) method and methods for arithmetic +- 
>> */^.
>>
>> In S4, an object of class "multipol" has one slot that holds an array.
>>
>> Objects of class "multipol" require specific arithmetic operations;  
>> a,b being
>> multipols means that a+b and a*b are defined in peculiar ways
>> that make sense in the context of the package. I can also add and  
>> multiply
>> by scalars (vectors of length one).
>>
>> My impression is that S3 is perfectly adequate for this task, although
>> I've not yet finalized the coding.
>>
>> S4 seems to be "overkill" for such a simple system.
>>
>> Can anyone give me some motivation for persisting with S4?
>>
>> Or indeed reassure me that S3 is a good design decision?
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] S3 vs S4 for a simple package
Oleg Sklyar