From mtmorgan at fhcrc.org  Tue Feb 14 19:02:35 2006
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Tue, 14 Feb 2006 10:02:35 -0800
Subject: [Rd] S4 classes and methods with optional arguments
In-Reply-To: <20060214154423.GA6722@essek.stat-math.wu-wien.ac.at> (Josef
	Leydold's message of "Tue, 14 Feb 2006 16:44:23 +0100")
References: <mailman.7.1139914801.6090.r-devel@r-project.org>
	<20060214154423.GA6722@essek.stat-math.wu-wien.ac.at>
Message-ID: <6ph4q31n7ic.fsf@wellington.fhcrc.org>

Echoing similar suggestions, but with a bit of philosophy... How about:

setGeneric("rstream.sample",
           function( stream, ... ) standardGeneric("rstream.sample"))

setMethod("rstream.sample", c( "numeric" ),
          function( stream, n = 1, ... ) { code }  )

It seems to me like the generic should (always?) just have arguments
used for dispatch -- stream, in this case -- and that methods then
specify default values. To also dispatch on the second argument, one
might

setGeneric("rstream.sample",
           function( stream, n, ... ) standardGeneric("rstream.sample"))

setMethod("rstream.sample", c( "rstream.sample", "numeric" ),
          function( stream, n, ... ) { code } )

setMethod("rstream.sample", c( "rstream.sample", "missing" ),
          function( stream, n, ... ) rstream.sample( stream, n = 1 ))

setMethod("rstream.sample", c( "rstream.sample", "otherclass" ),
          function( stream, n, ... ) n )

Martin

"Josef Leydold" <leydold at statistik.wu-wien.ac.at> writes:

> Hi,
>
> i have used S4 classes to implement a unified access to random number generators
> (package rstream on CRAN).
>
> I have used a construct to allow optional arguments:
>
> if(!isGeneric("rstream.sample"))
>         setGeneric("rstream.sample", function(stream,...) standardGeneric("rstream.sample"))
>
> setMethod("rstream.sample", c("rstream","numeric"), 
>           function(stream,n=1) { ... [ code ] ... } )
>
> Thus if rs is an instance of an rstream object one can a random
> sample of size 10 using 
>
> rstream.sample(rs, 10)
>
> for a sample of size 1 one can use equivalently
>
> rstream.sample(rs,1) 
> rstream.sample(rs) 
>
> however, with R-devel the above construct does not work any more, due to
> more stringent checkings. It can be fixed by replacing it by
>
> if(!isGeneric("rstream.sample"))
>         setGeneric("rstream.sample", function(stream,n) standardGeneric("rstream.sample"))
>
> setMethod("rstream.sample", c("rstream","numeric"), 
>           function(stream,n=1) { ... [ code ] ... } )
>
> then rstream.sample(rs) does not work any more.
>
> Is there still a way to allow optional arguments for methods of
> S4 classes?
>
> Josef
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] S4 classes and methods with optional arguments
Martin Morgan