[Rd] Using missing() in a S4 method with extra arguments
Martin Morgan
mtmorgan at fhcrc.org
Fri Mar 11 15:00:11 CET 2011
On 03/11/2011 02:07 AM, Andreas Borg wrote:
> Hi all,
>
> I have a function which makes use of missing() to determine which
> arguments are provided in the call - basically, there are two sets of
> arguments that map to different strategies the function uses to fulfill
> its task. After conversion to an S4 generic I've run into the problem
> that if a method uses extra arguments that are not in the signature of
> the generic, usage of missing() fails. The following example exemplifies
> this:
>
> setGeneric("fun", function(x=0, y=0, ...) standardGeneric("fun"))
> # both methods should output if the second argument is missing
> setMethod("fun", "character", function(x=0, y=0, ...) missing(y))
> setMethod("fun", "numeric", function(x=0, y=0, z=0, ...) missing(y))
>
> fun("a") # this works fine
> fun(1) # this gives "FALSE
Hi Andreas --
if you're testing for the missing-ness of y, and y is in the function
signature, then use that for dispatch
setMethod(fun, c("character", "missing"),
function(x=0, y=0, z=0, ...) "missing")
setMethod(fun, c("character", "ANY"),
function(x=0, y=0, z=0, ...) "not missing")
Since you're dispatching on x and y, it doesn't really make sense (to me
;) to assign default values to them. Testing for missing-ness of z would
I think have to rely on NA / NULL or other sentinel.
Martin
>
> I've understood so far that this is due to the fact that the "numeric"
> method in this example is rewritten to:
>
> function (x = 0, y = 0, ...)
> {
> .local <- function (x = 0, y = 0, z = 0, ...)
> missing(y)
> .local(x, y, ...)
> }
>
> The call to .local evaluates y and it is no more missing.
>
> Is there any alternative that works in this case? Or is there a chance
> that missing() might be changed to work in this case in the near future?
>
> Of course I know I could set NA or NULL as default values and check for
> these, but there are reasons I want to have legal default values for all
> arguments.
>
> Best regards,
>
> Andreas
>
> Andreas Borg
> Medizinische Informatik
>
> UNIVERSITÄTSMEDIZIN
> der Johannes Gutenberg-Universität
> Institut für Medizinische Biometrie, Epidemiologie und Informatik
> Obere Zahlbacher Straße 69, 55131 Mainz
> www.imbei.uni-mainz.de
>
> Telefon +49 (0) 6131 175062
> E-Mail: borg at imbei.uni-mainz.de
>
> Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte
> Informationen. Wenn Sie nicht der
> richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben,
> informieren Sie bitte sofort den
> Absender und löschen Sie diese Mail. Das unerlaubte Kopieren sowie die
> unbefugte Weitergabe
> dieser Mail und der darin enthaltenen Informationen ist nicht gestattet.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109
Location: M1-B861
Telephone: 206 667-2793
More information about the R-devel
mailing list