Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果扫描被转义,则使用默认值_R_Function_Controls - Fatal编程技术网

R 如果扫描被转义,则使用默认值

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

我需要编写一个函数,要求用户输入一个值,如果在键盘上按Esc键进行扫描,则设置为某个默认值。但以下方法不起作用:

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_value
r@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))