From wdunlap at tibco.com  Sat Oct 20 01:18:12 2012
From: wdunlap at tibco.com (William Dunlap)
Date: Fri, 19 Oct 2012 23:18:12 +0000
Subject: [Rd] setting option in function
In-Reply-To: <CAKctRd3mh4xK2+09yCvqi1fM2REMGQtQj1A=1M7voxcqw7r1Zw@mail.gmail.com>
References: <CAKctRd3mh4xK2+09yCvqi1fM2REMGQtQj1A=1M7voxcqw7r1Zw@mail.gmail.com>
Message-ID: <E66794E69CFDE04D9A70842786030B93378D44@PA-MBX04.na.tibco.com>

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



[Rd] setting option in function
William Dunlap