From murdoch at stats.uwo.ca  Tue Mar  7 16:12:36 2006
From: murdoch at stats.uwo.ca (Duncan Murdoch)
Date: Tue, 07 Mar 2006 10:12:36 -0500
Subject: [Rd] Expanding partial names
In-Reply-To: <971536df0603070642y295f4c64l74fb3e5d67b1605e@mail.gmail.com>
References: <440D9295.7090207@stats.uwo.ca>
	<971536df0603070642y295f4c64l74fb3e5d67b1605e@mail.gmail.com>
Message-ID: <440DA2E4.4030508@stats.uwo.ca>

On 3/7/2006 9:42 AM, Gabor Grothendieck wrote:
> Try this:
> 
> 
> wrapper <- function(...) {
>   args <- list(...)
>   if (length(args)) {
> 	  nf <- names(formals(lowlevel))
> 	  nams <- nf[pmatch(names(args), nf)]
> 	  args <- replace(list(longname = 2), nams, args)
>   }
>   do.call("lowlevel", args)
> }
> 
> Here is a test:
> 
>> wrapper()
> longname =  1
>> wrapper(longname = 34)
> longname =  34
>> wrapper(long = 34)
> longname =  34

Thanks, that's getting close, but it doesn't quite handle errors cleanly:

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

It looks like I'll need something fairly elaborate.

Duncan Murdoch

> 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?
>>
>> Duncan Murdoch
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Expanding partial names
Duncan Murdoch