如果扫描已转义,请使用默认值

问题描述 投票:2回答:4

我需要编写一个函数来询问用户的值,如果在键盘上按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

任何人都可以解释这种行为吗?

r function controls
4个回答
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)
}

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

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

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

但是没有处理enter键的情况。为此,必须将返回指令更改为:

return(ifelse(length(r)==0),default_value,r))
© www.soinside.com 2019 - 2024. All rights reserved.