Re: [Rd] messing with ...

From: Prof Brian Ripley <ripley_at_stats.ox.ac.uk>
Date: Wed, 13 Aug 2008 18:18:01 +0100 (BST)

On Wed, 13 Aug 2008, Tony Plate wrote:

> Ben Bolker wrote:

>>
>> I'm looking for advice on manipulating parameters that
>> are going to be passed through to another function.
>>
>> Specifically, I am working on my version of "mle",
>> which is a wrapper for optim (among other optimizers).
>> I would prefer not to replicate the entire argument
>> list of optim(), so I'm using ... to pass extra arguments
>> through.
>>
>> However:
>> the starting values are specified as a list,
>> which means that users can potentially specify them
>> in any order (or at least that's the way it works
>> now -- one solution to the problem I'm about to state
>> is to insist that they specify the parameters in the
>> same order as they are given in the arguments of
>> the objective function).
>> However, there are other arguments (lower, upper,
>> control$parscale, control$ndeps) that should all
>> be in the same order as the objective function
>> definition by the time they get to optim()). I can
>> think of a few solutions:
>>
>> (1) make the user specify them all in the right order (ugh)
>> (2) add all of them as explicit parameters to my function
>> so that I can rearrange them appropriately (ugh)
>> (3) mess with the ... argument before it gets passed
>> through to optim (impossible?)
>> (4) capture ... as arglist <- list(...), manipulate the arguments
>> as necessary, then pass them along to optim as
>> do.call("optim",arglist) (ugh but maybe the best solution?)
>>
>> any thoughts?
> here's my two cents:
> - require names on parameters, rather than order
> - construct calls and use eval() rather than do.call() (then you can 
> manipulate list(...) without the ugh factor of do.call() -- though is 
> do.call() any different to eval() in R? -- I know in S-PLUS that the use of 
> do.call() can completely blow out memory usage)

do.call is just a way to construct and eval() calls. Since it is internal C code it does it quite efficiently.

> - to avoid manually duplicating arg lists, use constructs like 
> names(formals(optim)) and pmatch to find args that below to the optimizer 
> function vs the objective function

Using wrappers is a better idea: you can see the idea in several places in the base graphics code.

-- 
Brian D. Ripley,                  ripley_at_stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Wed 13 Aug 2008 - 17:25:40 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 13 Aug 2008 - 19:36:35 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive