Skip to content

setting option in function

4 messages · Charles Geyer, Thomas Lumley, William Dunlap

#
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
#
old_options <- options(na.action=na.fail)
on.exit(options(old_options))

You can also use this to define a wrapper that executes an expression
using special options

withOptions<-function(optlist,expr){
        oldopt<-options(optlist)
        on.exit(options(oldopt))
        expr<-substitute(expr)
        eval.parent(expr)
        }


    -thomas
On Sat, Oct 20, 2012 at 10:35 AM, Charles Geyer <charlie at stat.umn.edu> wrote:

  
    
#
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