From murdoch at stats.uwo.ca  Tue Oct 24 19:53:40 2006
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Tue, 24 Oct 2006 13:53:40 -0400
Subject: [Rd] as.missing
In-Reply-To: <453E462C.6050103@bank-banque-canada.ca>
References: <453E462C.6050103@bank-banque-canada.ca>
Message-ID: <453E5324.60103@stats.uwo.ca>

On 10/24/2006 12:58 PM, Paul Gilbert wrote:
> (I'm not sure if this is a request for a feature, or another instance 
> where a feature has eluded me for many years.)
> 
> Often I have a function which calls other functions, and may often use 
> the default arguments to those functions, but needs the capability to 
> pass along non-default choices. I usually do this with some variation on
> 
> foo <- function(x, foo2Args=NULL or a list(foo2defaults),
>                     foo3Args=NULL or a list(foo3defaults))
> 
> and then have logic to check for NULL, or use the list in combination 
> with do.call.  It is also possible to do this with ..., but it always 
> seems a bit dangerous passing all the unnamed arguments along to all the 
> functions being called, especially when I always seem to be calling 
> functions that have similar arguments (maxit, eps, start, frequency, etc).
> 
> It is a situation I have learned to live with, but one of my 
> co-maintainers just pointed out to me that there should be a good way to 
> do this in R.  Perhaps there is something else I have missed all these 
> years?  Is there a way to do this cleanly? It would be nice to have 
> something like
> 
> foo <- function(x, foo2Args=as.missing(),  foo3Args=as.missing())
> 
> then the call to foo2 and foo3 could specify  foo2Args and foo3Args, but 
> these would get treated as if they were missing, unless they are given 
> other values.

I was going to say I couldn't see the difference between this and just 
declaring

  foo <- function(x, foo2Args, foo3Args)

with no defaults.  However, this little demo illustrates the point, I think:

 > g <- function(gnodef, gdef=1) {
+    if (missing(gnodef)) cat('gnodef is missing\n')
+    if (missing(gdef)) cat('gdef is missing\n')
+    cat('gdef is ',gdef,'\n')
+  }
 >
 >  f <- function(fnodef, fdef) {
+    g(fnodef, fdef)
+  }
 >
 >  g()
gnodef is missing
gdef is missing
gdef is  1
 >  f()
gnodef is missing
gdef is missing
Error in cat("gdef is ", gdef, "\n") : argument "fdef" is missing, with 
no default


What would be nice to be able to do is to have a simple way for f() to 
act just like g() does.

Duncan Murdoch




[Rd] as.missing
Duncan Murdoch