Использовать значение по умолчанию, если сканирование отключено - PullRequest
0 голосов
/ 30 августа 2018

Мне нужно написать функцию, которая будет запрашивать у пользователя значение, и если сканирование завершается нажатием клавиши 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

Кто-нибудь может объяснить это поведение?

Ответы [ 4 ]

0 голосов
/ 30 августа 2018

Этот код выглядит нормально:

set_value <- function() {
 default_value <- 0
 r <- default_value
 tryCatch(r<-scan(what = integer(), nmax = 1, quiet = TRUE),  finally = return(r))
}

rm("x")
x <- set_value()

1: # escape pressed there
x
# [1] 0

x <- 9
x <- set_value()

1: #escape pressed there
x
# [1] 0

Но регистр клавиши ввода не обрабатывается. Для этого инструкция возврата должна быть изменена на:

return(ifelse(length(r)==0),default_value,r))
0 голосов
/ 30 августа 2018

Вы можете использовать это:

 set_value <- function() {
 default_value <- 0
 # value <- ''
 value <- scan(what = integer(), nmax = 1, quiet = TRUE)
 if (length(value) == 0) return(default_value) else return(value)
 }
0 голосов
/ 30 августа 2018

Следующее действительно устанавливает значение по умолчанию, когда scan экранирован.

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)
}

rm(res)    # Make sure 'res' does not exist
res <- set_value()
res
#[1] 0

Редактировать.

Вот более полный сеанс.

> rm(res)
> res <- set_value()    # Press <ESC>
1: 

> res
[1] 0
> rm(res)
> res <- set_value()    # Press <Enter>
1: 
> res
integer(0)
> rm(res)
> res <- set_value()    # Press 123
1: 123
> res
[1] 123
0 голосов
/ 30 августа 2018

1001 * попробовать *

set_value <- function() {
  default_value <- 0
  value <- ''
  value <- scan(what = integer(), nmax = 1, quiet = TRUE)
  if (length(value) == 0) return(default_value) else return(value)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...