我需要编写一个函数,该函数将要求用户提供一个值,并且如果在键盘上按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
之前为空。
无论将扫描输入分配给哪个变量,R会话似乎都以某种方式记住了先前在扫描中输入的值。因此,当我调用一个函数并将其分配给变量set_value
时,然后在将其分配给x
的同时调用一个函数,但是从y
逃逸时,它仍然分配了先前扫描的值(请参见下文)。
scan
有人可以解释这种行为吗?
答案 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))