R 如果扫描被转义,则使用默认值
我需要编写一个函数,要求用户输入一个值,如果在键盘上按Esc键进行扫描,则设置为某个默认值。但以下方法不起作用:R 如果扫描被转义,则使用默认值,r,function,controls,R,Function,Controls,我需要编写一个函数,要求用户输入一个值,如果在键盘上按Esc键进行扫描,则设置为某个默认值。但以下方法不起作用: set_value <- function() { default_value <- 0 value <- '' value <- scan(what = integer(), nmax = 1, quiet = TRUE) if (value == '') return(default_value) else return(value) }
set_value <- function() {
default_value <- 0
value <- ''
value <- scan(what = integer(), nmax = 1, quiet = TRUE)
if (value == '') return(default_value) else return(value)
}
9
是在上一次scan
调用中提供给扫描的值,但在任何时候都没有分配给res
(可以观察到res
在调用set\u value
之前为空)
编辑2
似乎R会话不知何故一直记住以前在扫描中输入的值,而不管扫描输入分配给哪个变量。因此,当我调用一个函数并将其分配给变量x
,然后调用一个函数,同时将其分配给y
,但退出scan
,它仍然分配了以前扫描过的值(见下文)
>设置值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)
}
set_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
set_值rm(res)
>res 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
尝试过,但当scan
被转义时,返回值甚至没有命中,并且函数似乎返回以前输入的值(来自以前的函数调用),那么总是返回默认值(即使在扫描中输入了一些值),我无法在编辑中重现该行为。对我来说,一切都如期而至。在R的工作目录中是否有名为.RData
的文件?(那是文件名,不是扩展名。)也许你正在恢复以前的会话或类似的奇怪的东西。尝试退出,删除所述文件(如果存在),然后重新启动R.@RuiBarradas I have deleted.RData文件,并且仅在第一次转义调用set_value
时,才将该值设置为0。一旦我将一个值设置为2,并尝试再次调用该函数,将其转义,然后该值不再重新启动为0,而是保持为2。因此,该函数似乎只有在第一次调用时才正常工作。我用一个示例进行了另一次编辑。在转义scan
时不指定默认值。在转义scan
时不指定默认值。这是weeeird,但它对我不起作用。不过,为了避免将此设置设置为先前扫描的值,请查看我的控制台副本:>set_valuer@jakes我正在ubuntu 18.04上运行R3.5.1,但我不认为这有什么区别。如果您退出scan
则res
的上一个值仍将是原来的值,您所说的没有错误,这是预期的行为。请查看我的帖子编辑,这里有一个解释。请查看我的帖子编辑,这里有一个解释。我已经尝试了你的功能,问题仍然存在。请查看带有我控制台输出的编辑2。@jakes,我知道了!我所有的实验都是在标准RGui-et下进行的,在那里,它和Ruy溶液一样完美。但是如果您从RStudio执行代码(我同时使用了1.1.453和1.0.453),那么代码的行为与您描述的一样。这不是R的问题,而是您使用的GUI的问题。@jakes如果没有quiet=TRUE,我的代码也会使用Rstudio运行。问题似乎是quiet=TRUE绕过了catch
及其finally,而变量x中得到的不是上次扫描的结果,而是变量x没有改变。
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
return(ifelse(length(r)==0),default_value,r))