如果逃避扫描,请使用默认值

时间:2018-08-30 14:12:13

标签: r function controls

我需要编写一个函数,该函数将要求用户提供一个值,并且如果在键盘上按Esc键可以避免扫描,请设置为一些默认值。但是以下操作无效:

!important

我该如何实现?要求输入内容时,我需要停止脚本,因此我不应该使用set_value <- function() { default_value <- 0 value <- '' value <- scan(what = integer(), nmax = 1, quiet = TRUE) if (value == '') return(default_value) else return(value) } 而是坚持使用readline

编辑

许多人都发布了答案,所有这些都导致了奇怪的行为,因此我决定详细说明这里发生的事情。当我在键盘上按Esc键时,这些答案均未设置为默认值。请使用@RuiBarradas函数查看控制台的输出。

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) + } > res Error: object 'res' not found > res <- set_value() 1: # Here I pushed Esc on a keyboard > res [1] 9 是在先前的9调用中提供的用于扫描的值,但是在任何时候都没有分配给scan(如您所见res在调用res之前为空。

编辑2

无论将扫描输入分配给哪个变量,R会话似乎都以某种方式记住了先前在扫描中输入的值。因此,当我调用一个函数并将其分配给变量set_value时,然后在将其分配给x的同时调用一个函数,但是从y逃逸时,它仍然分配了先前扫描的值(请参见下文)。

scan

有人可以解释这种行为吗?

4 个答案:

答案 0 :(得分:0)

尝试

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

答案 1 :(得分:0)

您可以使用此:

value

答案 2 :(得分:0)

以下内容的确设置了转义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

答案 3 :(得分:0)

此代码似乎还可以:

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