control list gotcha
On Sat, Sep 10, 2011 at 12:31 PM, John C Nash <nashjc at uottawa.ca> wrote:
This is mainly a reminder to others developing R packages to be careful not to supply control list items that are not used by the called package. Optimx is a wrapper package that aims to provide a common syntax to a number of existing optimization packages. Recently in extending optimx package I inadvertently introduced a new control for optimx which is NOT in any of the wrapped optimization packages. There are probably other methods of keeping things tidy, but I copy the control list and null out unwanted elements for each of the called packages. I missed this in a couple of places in the R-forge development version of optimx (Iam working on fixing these, but they are still there at the moment). The "nasty" here was that the package mostly works, with plausible but not very good results for some of the optimizers. If it crashed and burned, it would have been noticed sooner. There is also a potential interaction with a use of the dot-dot-dot variable to pass scaling information. If there are ideas on how to quickly reveal errors related to calling sequences involving control lists and "...", I'd welcome them (off-list?), and be prepared to summarize findings in a vignette.
Suppose we wish to call f with the control.list components plus
those in the default.args not already specified in the control.list.
If any such arg is not an arg of f exclude it:
# test data - f, default.args and control.list
f <- function(a, b, c = 0, d = 1) print(match.call())
default.args <- list(a = 2, b = 1)
control.list <- list(a = 1, d = 2, e = 3)
# override default.args with control.list
use.args <- modifyList(default.args, control.list)
# exclude components of use.args that are not args of f
sel <- names(use.args) %in% names(as.list(args(f)))
final.args <- use.args[sel]
# run f
do.call("f", final.args)
The last line gives:
do.call("f", final.args)
f(a = 1, b = 1, d = 2)
Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com