[R] matching last argument in function
Alistair Gee
alistair.gee at gmail.com
Wed Feb 13 19:29:29 CET 2008
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 <ggrothendieck at gmail.com> 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 <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.
> >
>
More information about the R-help
mailing list