Hi Charley,
You can use the idiom
oldNaAction <- options(na.action=na.fail)
on.exit(options(oldNaAction))
or the slightly safer (protected again an interrupt
between the first two lines or an error calling options
to set them)
oldNaAction <- getOption("na.action")
on.exit(options(oldNaAction))
options(na.action=na.fail)
.
I prefer to bury it in a function like
withOption <- function(optionList, expr) {
stopifnot(is.list(optionList))
oldOptionList <- options(names(optionList))
on.exit(options(oldOptionList))
options(optionList)
expr # lazily evaluate now
}
used as
> getOption("na.action")
[1] "na.omit"
> withOption(list(na.action = "na.fail"), lm(y~x,
data=data.frame(x=c(1,2,NA), y=1:3)))
Error in na.fail.default(list(y = 1:3, x = c(1, 2, NA))) :
missing values in object
> withOption(list(na.action = "na.exclude"), lm(y~x,
data=data.frame(x=c(1,2,NA), y=1:3)))
Call:
lm(formula = y ~ x, data = data.frame(x = c(1, 2, NA), y = 1:3))
Coefficients:
(Intercept) x
0 1
> getOption("na.action")
[1] "na.omit"
The function makes it less painful to use the safer version and you
don't have to worry about a subsequent call to on.exit()
wiping out the current request to do something on exiting
the function.
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
> -----Original Message-----
> From: r-devel-bounces at r-project.org [mailto:r-devel-bounces at
r-project.org] On Behalf
> Of Charles Geyer
> Sent: Friday, October 19, 2012 2:35 PM
> To: r-devel at r-project.org
> Subject: [Rd] setting option in function
>
> is it possible to set an option inside a function ((I want to set
> na.action = na.fail) and have the previous state restored if there is
> an error so that the function doesn't change the option behind the
> user's back?
>
> Sorry if this has been answered before, but this subject is hard to Google.
>
> --
> Charles Geyer
> Professor, School of Statistics
> University of Minnesota
> charlie at stat.umn.edu
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel