I often want to temporarily modify the options() options, e.g. a <- seq(10000001, 10000001 + 10) # some wide object with.options <- function(..., expr) { options0 <- options(...) tryCatch(expr, finally=options(options0)) } Then I can use: with.options(width=160, expr = print(a)) But I'd like to avoid explicitly naming the expr argument, as in: with.options(width=160, print(a)) How can I do this with R's argument matching? (I prefer the expr as the last argument since it could be a long code block. Also, I'd like with.options to take multiple options.) TIA
Alistair - I don't believe this is possible. The only way formal arguments (like expr) can be matched after a '...' is with *exact* name matching. Why do you want to avoid explicitly naming the expr argument? If you always want the expr argument last, you might be able to just use ... as the sole argument to your function, and strip off the last element inside the function as 'expr', and use all but the last element as your list of options. This requires that expr always be given last though. Probably best just to explicitly name the expr argument. Erik Iverson Alistair Gee wrote:> I often want to temporarily modify the options() options, e.g. > > a <- seq(10000001, 10000001 + 10) # some wide object > > with.options <- function(..., expr) { > options0 <- options(...) > tryCatch(expr, finally=options(options0)) > } > > Then I can use: > > with.options(width=160, expr = print(a)) > > But I'd like to avoid explicitly naming the expr argument, as in: > > with.options(width=160, print(a)) > > How can I do this with R's argument matching? (I prefer the expr as > the last argument since it could be a long code block. Also, I'd like > with.options to take multiple options.) > > TIA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
On Tue, 12 Feb 2008, Alistair Gee wrote:> I often want to temporarily modify the options() options, e.g. > > a <- seq(10000001, 10000001 + 10) # some wide object > > with.options <- function(..., expr) { > options0 <- options(...) > tryCatch(expr, finally=options(options0)) > } > > Then I can use: > > with.options(width=160, expr = print(a)) > > But I'd like to avoid explicitly naming the expr argument, as in: > > with.options(width=160, print(a)) > > How can I do this with R's argument matching?You can't. You could provide a list, though: with.options <- function(optionlist,expr){ option0<-options(optionlist) on.exit(options(options0)) eval.parent(expr) } then with.options(width=160, print(a)) with.options(list(width=160, warn=1), print(a)) -thomas Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle
Try this: with.options <- function(...) { L <- as.list(match.call())[-1] len <- length(L) old.options <- do.call(options, L[-len]) on.exit(options(old.options)) invisible(eval.parent(L[[len]])) }> with.options(width = 40, print(1:25))[1] 1 2 3 4 5 6 7 8 9 10 11 12 [13] 13 14 15 16 17 18 19 20 21 22 23 24 [25] 25> with.options(width = 80, print(1:25))[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 On Feb 12, 2008 12:45 PM, Alistair Gee <alistair.gee at gmail.com> wrote:> I often want to temporarily modify the options() options, e.g. > > a <- seq(10000001, 10000001 + 10) # some wide object > > with.options <- function(..., expr) { > options0 <- options(...) > tryCatch(expr, finally=options(options0)) > } > > Then I can use: > > with.options(width=160, expr = print(a)) > > But I'd like to avoid explicitly naming the expr argument, as in: > > with.options(width=160, print(a)) > > How can I do this with R's argument matching? (I prefer the expr as > the last argument since it could be a long code block. Also, I'd like > with.options to take multiple options.) > > TIA > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >