Add envir = parent.frame() to the do.call:
with.options <- function(...) { L <- as.list(match.call())[-1] len <- length(L) old.options <- do.call(options, L[-len], envir = parent.frame()) on.exit(options(old.options)) invisible(eval.parent(L[[len]])) } # test with.options(width = 40, print(1:25)) test <- function(w) with.options(width = w, print(1:25)) test(40) On Feb 13, 2008 1:29 PM, Alistair Gee <[EMAIL PROTECTED]> wrote: > Hi Gabor, > > That almost works ... but it fails when I nest with.options() within > another function: > > 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.width <- function(w) > with.options(width=w, print(1:25)) > > m.with.width(10) > > > Error in function (...) : object "w" not found > > Enter a frame number, or 0 to exit > > 1: with.width(10) > 2: with.options(width = w, print(1:25)) > 3: do.call(options, L[-len]) > 4: function (...) > > I tried, unsuccessfully, to fix the problem by using eval.parent() > around do.call() and around L[-len]. > > This problem does not occur if I use my original implementation: > > with.options <- function(..., expr) { > options0 <- options(...) > tryCatch(expr, finally=options(options0)) > } > > I realize that I can use my original implementation in this particular > case, but I'd like to have a single implementation that works > correctly, while not requiring explicitly naming the expr argument. > > TIA > > > On Feb 12, 2008 12:43 PM, Gabor Grothendieck <[EMAIL PROTECTED]> wrote: > > 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 <[EMAIL PROTECTED]> 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@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. > > > > > > ______________________________________________ R-help@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.