I am trying to understand the missing vs default value for an argument
to an S4 method. (I'm not sure if this is a bug or my confusion.) In S3
I can specify a default value for an argument and then both check if the
argument was missing in the call, and use it because it takes on the
default value. I do not seem to be able to do that in S4 as shown by
this simplified example:

 

setGeneric("TSdoc",

   def= function(x, con, ...) standardGeneric("TSdoc"))

 

setMethod("TSdoc",   signature(x="character", con="missing"),

    definition= function(x, con=getOption("TSconnection"), ...){

        if(is.null(con))

           stop("con should be specified or set with
options(TSconnection=con).")

        else return('ok')} )

 

Then when I try

   TSdoc("B103")

In my original problem I got

   Error in is.null(con) : 'con' is missing

And in the simplified example I get

  Error in TSdoc("B103") :

    element 1 is empty;

     the part of the args list of 'is.null' being evaluated was:

     (con)

 

I'm not sure why there is a difference, but the implication is the same
in both, the default   

> getOption("TSconnection")

NULL

 

Is not getting through to the is.null().  I can fix (or work around)
this with

 

setMethod("TSdoc",   signature(x="character", con="missing"),

   definition= function(x, con,  ...){

       if(is.null(con <- getOption("TSconnection")))

          stop("con should be specified or set with
options(TSconnection=con).")

       else return('ok') } )

 

TSdoc("B103")

Error in TSdoc("B103") :

  con should be specified or set with options(TSconnection=con).

 

So my question is, is this a bug or do I have to adjust my programming
style for the way missing/default arguments are handled in S4?

 

Paul Gilbert

====================================================================================

La version française suit le texte anglais.

------------------------------------------------------------------------------------

This email may contain privileged and/or confidential information, and the Bank of
Canada does not waive any related rights. Any distribution, use, or copying of this
email or the information it contains by other than the intended recipient is
unauthorized. If you received this email in error please delete it immediately from
your system and notify the sender promptly by email that you have done so. 

------------------------------------------------------------------------------------

Le présent courriel peut contenir de l'information privilégiée ou confidentielle.
La Banque du Canada ne renonce pas aux droits qui s'y rapportent. Toute diffusion,
utilisation ou copie de ce courriel ou des renseignements qu'il contient par une
personne autre que le ou les destinataires désignés est interdite. Si vous recevez
ce courriel par erreur, veuillez le supprimer immédiatement et envoyer sans délai à
l'expéditeur un message électronique pour l'aviser que vous avez éliminé de votre
ordinateur toute copie du courriel reçu.

	[[alternative HTML version deleted]]

