我不認爲有一種方法可以防止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中的Source按鈕(無限循環)以及Bash命令行上的Rscript
(程序中止),可以按預期工作。
如果您將其作爲源文件執行,那麼它將按照您的要求工作。例如,如果您將3行代碼複製並粘貼到控制檯並按Enter,則它將分別運行每行代碼。第二種模式可能是運行按鈕的操作。 – lmo
@lmo謝謝 - 問題是我認識的大多數人都是交互式的程序。我正在爲社會科學家編寫一個教程,將測試放在他們的代碼中,並且需要在他們所在的位置見到他們。 –
總是有'tryCatch'和'try'。 – lmo