Expanding partial names
Whoops, just noticed that I cut when I should have copied. The newArgs
function should look like this:
newArgs <- function(..., Params) {
f <- function(...) list(...)
formals(f) <- c(Params, formals(f))
names <- as.list(names(Params))
names(names) <- names
names <- lapply(names, as.name)
b <- as.list(body(f))
body(f) <- as.call(c(b[1], names, b[-1]))
f(...)
}
Duncan Murdoch
On 3/7/2006 9:18 PM, Duncan Murdoch wrote:
Okay, here's my effort based on Deepayan's and Charles' ideas. The newArgs function is not what I'd call transparent, but I like the way the wrapper looks.
> newArgs <- function(..., Params) {
+ f <- function(...) list(...) + formals(f) <- c(Params, formals(f)) + b <- as.list(body(f)) + body(f) <- as.call(c(b[1], names, b[-1])) + f(...) + }
>
> lowlevel <- function(longname = 1) {
+ cat("longname = ", longname, "\n")
+ }
> > newDefaults <- list(longname=2) > > wrapper <- function (...)
+ do.call("lowlevel", newArgs(..., Params=newDefaults))
newArgs sets up f to look like
function (longname = 2, ...) list(longname = longname, ...)
and then calls it. The thing I like about this, as opposed to using
pmatch, is that I'm sure the partial matching is what's used by R's
argument matching, whereas that's only pretty likely with pmatch.
I also sort of like these lines:
+ names <- as.list(names(Params))
+ names(names) <- names
+ names <- lapply(names, as.name)
but maybe I should have named Params as names, so they looked like this:
+ names <- as.list(names(names))
+ names(names) <- names
+ names <- lapply(names, as.name)
And of course I like the fact that this seems to work, but we've seen
several versions that do that:
> wrapper()
longname = 2
> wrapper(longname=3)
longname = 3
> wrapper(long=3)
longname = 3
> wrapper(long=20)
longname = 20
> wrapper(junk=20)
Error in lowlevel(longname = 2, junk = 20) :
unused argument(s) (junk ...)
Duncan Murdoch