我需要编写一个函数来询问用户的值,如果在键盘上按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
是空的)。
似乎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
任何人都可以解释这种行为吗?
尝试
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)
}
你可以用这个:
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)
}
当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
这段代码似乎没问题:
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
但是没有处理enter键的情况。为此,必须将返回指令更改为:
return(ifelse(length(r)==0),default_value,r))