From deepayan.sarkar at gmail.com  Tue Mar  7 20:00:46 2006
From: deepayan.sarkar at gmail.com (Deepayan Sarkar)
Date: Tue, 7 Mar 2006 13:00:46 -0600
Subject: [Rd] Expanding partial names
In-Reply-To: <440D9295.7090207@stats.uwo.ca>
References: <440D9295.7090207@stats.uwo.ca>
Message-ID: <eb555e660603071100r57d5f956v453161406fb32c65@mail.gmail.com>



On 3/7/06, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
> I'm writing wrappers for some functions that change some of the default 
> arguments.  I'd rather not list all of the arguments for the low level 
> functions because there are about a dozen wrapper functions, and about 
> 20 arguments to lowlevel.  Instead I'm trying something like this:
> 
> lowlevel <- function(longname = 1) {
>    cat("longname = ", longname, "\n")
> }
> 
> wrapper <- function(...) {
>    newargs <- list(longname = 2)
>    newargs[names(list(...))] <- list(...)
>    do.call("lowlevel", newargs)
> }
> 
> This almost works:
> 
>  > wrapper()
> longname =  2
>  > wrapper(longname = 3)
> longname =  3
> 
> But it fails if I try to use partial argument matching:
> 
>  > wrapper(long=4)
> Error in lowlevel(longname = 2, long = 4) :
>          unused argument(s) (long ...)
> 
> because long isn't matched to longname.  Is there a reasonable way to do 
> this (e.g. using pmatch or charmatch) other than listing all the low 
> level arguments in the argument list to wrapper?

One trick I often use that is different from any of the suggestions I have seen so far (and is more transparent IMO) is the following:


lowlevel <- function(longname = 1) {
   cat("longname = ", longname, "\n")
}

wrapper <- function(...) {
    newArgs <-
        function(longname = 2, ...)
            list(longname = longname,
                 ...)
    do.call("lowlevel", newArgs(...))
}

which gives:

> wrapper()
longname =  2 
> wrapper(longname = 3)
longname =  3 
> wrapper(long=20)
longname =  20 
> wrapper(junk=3)
Error in lowlevel(longname = 2, junk = 3) : 
	unused argument(s) (junk ...)

-Deepayan



[Rd] Expanding partial names
Deepayan Sarkar