Hi I have written a whole bunch of methods for objects of class "octonion". [ an octonion is a single column of an eight-row matrix. Octonions have their own multiplication rules and are a generalization of quaternions, which are columns of a four-row matrix. ] So far I've done about a dozen generic functions such as seq.octonion(), rep.octonion(), [<-.octonion(), and so on and so on. Very nearly all of these functions are applicable to objects of class "quaternion". So, for example, I have a generic function Im.octonion(): R> Im.octonion function (x) { Re(x) <- 0 return(x) } The definition of Im.quaternion() is exactly the same. Sometimes the return value is an octonion: Conj.octonion function (x) { x <- as.matrix(x) x[-1, ] <- -x[-1, ] return(as.octonion(x)) } So the last line of Conj.quaternion() would be "return(as.quaternion (x))" but would be otherwise identical. A similar story holds for each of maybe twenty generic functions. Nearly all the Rd files are similarly identical: the word "octonion" replaces the word "octonion". I suppose "A" changes to "An" as well. There is a small number of functions and datasets that are specific to octonions. What is Best Practice in this situation? I don't want to edit two separate packages in tandem. Is there a mechanism for doing what I want in the context of a bundle? -- Robin Hankin Uncertainty Analyst National Oceanography Centre, Southampton European Way, Southampton SO14 3ZH, UK tel 023-8059-7743
Gabor Grothendieck
2005-Sep-09 13:08 UTC
[Rd] two almost identical packages: best practice
On 9/9/05, Robin Hankin <r.hankin at noc.soton.ac.uk> wrote:> Hi > > I have written a whole bunch of methods for objects of class "octonion". > > [ > an octonion is a single column of an eight-row matrix. Octonions have > their own multiplication rules and are a generalization of quaternions, > which are columns of a four-row matrix. > ] > > So far I've done about a dozen generic functions such as seq.octonion(), > rep.octonion(), [<-.octonion(), and so on and so on. > > Very nearly all of these functions are applicable to objects of > class "quaternion". > So, for example, I have a generic function Im.octonion(): > > R> Im.octonion > function (x) > { > Re(x) <- 0 > return(x) > } > > The definition of Im.quaternion() is exactly the same. > Sometimes the return value is an octonion: > > Conj.octonion > function (x) > { > x <- as.matrix(x) > x[-1, ] <- -x[-1, ] > return(as.octonion(x)) > } > > So the last line of Conj.quaternion() would be "return(as.quaternion > (x))" > but would be otherwise identical. > A similar story holds for each of maybe twenty generic functions. > Nearly all the Rd files are similarly identical: the word "octonion" > replaces the word "octonion". I suppose "A" changes to "An" as well. > > There is a small number of functions and datasets that are specific > to octonions. > > What is Best Practice in this situation? I don't want to edit two > separate > packages in tandem. Is there a mechanism for doing what I want > in the context of a bundle?Not sure what is best but some possibilities are to: - create a third S3 class and make your two classes subclasses of that or - make one of your classes a subclass of the other or - in some cases, you may be able to use the .default method for common code. You can also make use of NextMethod if you like though I am not sure if it will buy you much in this situation (see the dyn package for examples of the use of NextMethod).
On 9 Sep 2005, r.hankin at noc.soton.ac.uk wrote:> I have written a whole bunch of methods for objects of class > "octonion". > > So far I've done about a dozen generic functions such as > seq.octonion(), rep.octonion(), [<-.octonion(), and so on and so on. > > Very nearly all of these functions are applicable to objects of > class "quaternion".One solution would be to define a common base class (perhaps nionBase? ;-) and put the common methods there. So in S3 I guess you'd have an Im.nionBase function and your octonions and quaternions would be subclasses of nionBase.> (x))" but would be otherwise identical. A similar story holds for > each of maybe twenty generic functions. Nearly all the Rd files are > similarly identical: the word "octonion" replaces the word > "octonion". I suppose "A" changes to "An" as well.If you document the generics for the base class, I think that would work. Otherwise, find/replace.> There is a small number of functions and datasets that are specific > to octonions. > > What is Best Practice in this situation? I don't want to edit two > separate > packages in tandem. Is there a mechanism for doing what I want > in the context of a bundle?If they need to be in separate packages, perhaps you have three packages: nionBase quaternion (depends on nionBase) etc. HTH, + seth