Мне нужно написать функцию, которая будет запрашивать у пользователя значение, и если сканирование завершается нажатием клавиши Esc на клавиатуре, установите какое-либо значение по умолчанию. Но следующее не работает:
set_value <- function() {
default_value <- 0
value <- ''
value <- scan(what = integer(), nmax = 1, quiet = TRUE)
if (value == '') return(default_value) else return(value)
}
Как мне этого добиться? Мне нужно остановить скрипт при запросе ввода, поэтому я не должен, вероятно, использовать readline
, но придерживаться scan
Редактировать
Поскольку многие из вас опубликовали ответ, и все они привели к странному поведению, я решил уточнить, что здесь происходит. Любой из этих ответов не устанавливается по умолчанию, когда я нажимаю клавишу Esc на клавиатуре. Пожалуйста, посмотрите вывод из моей консоли с функцией @ RuiBarradas.
> set_value <- function() {
+ default_value <- 0
+ value <- NULL
+ on.exit(if(is.null(value)) return(default_value) else return(value))
+ value <- scan(what = integer(), nmax = 1, quiet = TRUE)
+ }
> res
Error: object 'res' not found
> res <- set_value()
1: # Here I pushed Esc on a keyboard
> res
[1] 9
9
- это значение, которое было предоставлено для сканирования во время предыдущего вызова scan
, но не было присвоено res
в любой точке (как вы можете заметить, res
был пуст до вызова set_value
).
Редактировать 2
Кажется, что R сессия каким-то образом продолжает запоминать значения, ранее введенные при сканировании, независимо от того, какой переменной был назначен вход для сканирования. Поэтому, когда я вызываю функцию и присваиваю ее переменной x
, затем вызываю функцию, присваивая ее y
, но при выходе из scan
ей все еще присваивается предварительно сканированное значение (см. Ниже).
> set_value <- function() {
+ default_value <- 0
+ r <- default_value
+ tryCatch(r<-scan(what = integer(), nmax = 1, quiet = TRUE), finally = return(r))
+ }
>
> x <- set_value()
1: 2
> x
[1] 2
> y
Error: object 'y' not found
> y <- set_value()
1:
> y
[1] 2
Кто-нибудь может объяснить это поведение?