开朗的花生 · c语言如何调节字体大小 - CSDN文库· 19 小时前 · |
成熟的匕首 · dqn不收敛一直震荡怎么办 - CSDN文库· 8 小时前 · |
兴奋的熊猫 · 2023低成本欧洲留学新潮流!QS前100欧 ...· 10 月前 · |
失眠的红豆 · 读厚黑学的人都坏?对不起,这口锅《厚黑学》不 ...· 1 年前 · |
善良的手电筒 · 种族主义者的可笑逻辑:纳粹德国如何解释北欧人 ...· 1 年前 · |
爱看书的竹笋 · 我想读胡雪岩传记,哪本书写的最真实? - 知乎· 1 年前 · |
在RStudio中执行代码块时,当出现错误时,执行实际上并不会停止。例如,如果我在打开的编辑器中有以下代码:
x <- 'test'
stopifnot(is.numeric(x))
print('hello world')
并运行它(使用命令-return或单击" run“按钮),它会打印错误,但随后继续并执行print语句。
有没有一种方法可以将RStudio配置为不跳过错误?也就是说,让它停在上面的第2行,而不是继续打印语句?
编辑:我刚刚意识到,如果我在标准R GUI中使用命令-R发送代码块,也会发生这种情况。
发布于 2017-02-16 03:39:33
我不认为有一种方法可以阻止RStudio运行所有行,当您选择一个节并按Ctrl+Enter键时。Rstudio只是一行接一行地运行。即使在函数内部调用
stopifnot()
,该函数调用之后的所有行仍将被计算。
如果你的目标仅仅是在出现错误时得到通知,在大量代码白运行之前,也许你可以定义一个类似于
stopifnot()
的函数,如果出现错误,它将进入无穷无尽的循环。然后,您可以按
Esc
或RStudio中的停止按钮来中断程序。如下所示:
waitifnot <- function(cond) {
if (!cond) {
message(deparse(substitute(cond)), " is not TRUE")
while (TRUE) {}
}
现在,您可以使用此函数运行示例代码:
x <- 'test'
waitifnot(is.numeric(x))
print('hello world')
不出所料,
hello world
永远不会打印。您将收到一条错误消息,告诉您出现了错误,然后程序将一直等到您手动中止它。
除了交互模式之外,这在任何情况下都不能很好地工作。为了避免不愉快的情况,您还可以让函数做出不同的反应,如果它不是在交互模式下使用的,例如:
waitifnot <- function(cond) {
if (!cond) {
msg <- paste(deparse(substitute(cond)), "is not TRUE")
if (interactive()) {
message(msg)
while (TRUE) {}
} else {
stop(msg)
}
仅当在交互模式下运行时,此函数才会进入无限循环。否则,它将简单地通过调用
stop()
中止执行。我已经检查了Ctrl+Enter或RStudio中的源按钮(死循环)和Bash命令行上的
Rscript
(中止程序)是否能正常工作。
发布于 2021-08-10 13:24:29
解决此问题的一种方法是配置R
'error'
选项,以便在遇到错误时运行自定义函数。
一个示例错误处理函数可以使用
Sys.sleep
暂停R的执行,并等待用户输入(例如,通过按ctrl-C来中断正在运行的函数,或者在Mac上的R-Studio中退出)。
正常情况下,R将继续执行任何后续命令。然而,我们可以通过定义一个函数来防止这种情况发生,该函数将“吃掉”所有这些代码,这样它们就不会运行。为了让这个过程更流畅,我们可以在每个“吃”行之后输出一个“cursor up”字符序列,这会在下一行被输出时清除掉它们,这样没有运行的行就不会弄乱终端/控制台。
示例代码:
# Define our error-handling pause function:
pause=function(){
on.exit(eat_input())
cat("Paused: press ctrl-C (or Escape key in Rstudio) to continue\n")
cat("(any subsequent code will be ignored)\n")
Sys.sleep(Inf)
# Define our 'eat_input' function to prevent output of subsequent, not-run input:
eat_input=function(){
cat("\033[1A")
while((x=readline())!='')cat("\033[1A")
# Set the 'error' option to execute our pause function:
options(error=pause)
试试看:
print("Before the error")
开朗的花生 · c语言如何调节字体大小 - CSDN文库 19 小时前 |
冷静的哑铃 · WIN API创建了一个文本框,用WM_CTLCOLOREDIT给它设置了背景色。但把编辑框加上ES_READONLY,即设为只读后,背景色变白,怎么解决 - CSDN文库 19 小时前 |
成熟的匕首 · dqn不收敛一直震荡怎么办 - CSDN文库 8 小时前 |
爱看书的竹笋 · 我想读胡雪岩传记,哪本书写的最真实? - 知乎 1 年前 |