2017-02-15 143 views
7

在RStudio中執行代碼塊時,發生錯誤時執行實際上不會停止。例如,如果我在打開的編輯器下面的代碼:在RStudio/Interactive R會話中發生錯誤時執行停止

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

並運行(或者使用命令返回或通過單擊「運行」按鈕),它打印錯誤,但隨後遊行上並執行打印聲明。

有沒有一種方法可以配置RStudio不會超過錯誤?即在上面的第2行停下來,而不是繼續打印聲明?

編輯:剛纔意識到這也發生,如果我使用命令-R在標準R GUI中發送代碼塊。

+0

如果您將其作爲源文件執行,那麼它將按照您的要求工作。例如,如果您將3行代碼複製並粘貼到控制檯並按Enter,則它將分別運行每行代碼。第二種模式可能是運行按鈕的操作。 – lmo

+1

@lmo謝謝 - 問題是我認識的大多數人都是交互式的程序。我正在爲社會科學家編寫一個教程,將測試放在他們的代碼中,並且需要在他們所在的位置見到他們。 –

+0

總是有'tryCatch'和'try'。 – lmo

回答

0

我不認爲有一種方法可以防止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(程序中止),可以按預期工作。

相關問題