更改函数环境中的options()而不更改R中全局环境中的options()?

Ben*_*Ben 3 environment global r function option

为了抑制数字的指数表示法,在我的全球环境中我有options("scipen" = 100).要做一些我需要指数表示法的东西,我想暂时改变一个函数内部的这个选项,比如

f <- function(x){
                 options("scipen" = -100)
                 ...
}
Run Code Online (Sandbox Code Playgroud)

但是,更改函数内的选项也会自动更改全局环境中的选项.有没有办法在函数内局部更改选项?

Jos*_*ien 9

这是一个使用的好地方on.exit().它具有确保oo退出函数调用的评估帧之前将选项重置为其原始值(存储在其中)的优点- 即使该退出是错误的结果.

f <- function(x) {
    oo <- options(scipen = -100)
    on.exit(options(oo))
    print(x)
}

## Try it out
1111
## [1] 1111
f(1111)
## [1] 1.111e+03
1111
## [1] 1111
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

withr 包可以做到这一点:

library(withr)
f <- function(x) with_options(list(scipen = -100), {
          print(x)
})
f(1.2)
## [1] 1.2e+00
getOption("scipen")
## [1] 0
Run Code Online (Sandbox Code Playgroud)