2016-02-23 4 views
3

Чтобы подавить экспоненциальные обозначения для чисел, в моей глобальной среде у меня есть options("scipen" = 100). Для того, чтобы сделать некоторые вещи, где мне нужна экспоненциальная нотация, я хочу, чтобы временно изменить этот параметр внутри функции, какИзменение параметров() в среде функций без изменения параметров() в глобальной среде в R?

f <- function(x){ 
       options("scipen" = -100) 
       ... 
} 

Однако, изменяя параметры внутри функции автоматически изменяет параметры в глобальных окружающей средах, а также. Есть ли способ изменить параметры локально внутри функции?

+1

Получить значение в момент вызова функции с помощью 'опций («scipen»)', измените параметр, сделать намеченную работу в и при завершении сбросить значение перед выходом из функции. – nicola

+0

Добро пожаловать в «замечательный» мир, который является глобальным значением. –

+0

@nicola Очень полезный намек, может быть наиболее легко выполнен по предложению Джоша, on.exit(). – Ben

ответ

8

Это хорошее место для использования 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 
+0

Perfect, on.exit() - именно то, что я искал. Большое спасибо! – Ben

3

Пакет withr может сделать:

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