2013-01-22 20 views
16

有什麼辦法可以無誤地停止R程序嗎?無誤地停止R程序

例如我有一個很大的來源,定義了幾個函數,之後有一些函數調用。碰巧我編輯了一些函數,並希望函數定義在R環境中更新,但實際上並沒有調用它們。

我定義了一個變量justUpdate,並且當它是TRUE想要停止剛纔函數定義之後的程序。

ReadInput <- function(...) ... 
Analyze <- function(...) ... 
WriteOutput <- function(...) ... 

if (justUpdate) 
    stop() 
# main body 
x <- ReadInput() 
y <- Analyze(x) 
WriteOutput(y) 

我呼籲stop()功能,但問題是,它輸出錯誤消息。

CTRL +ç是另一種選擇,但我想停止在特定行的源代碼。

q()quit()的問題是它終止了R會話,但我想讓R會話仍然打開。 @JoshuaUlrich提出browser()

如可以是另一種選擇,但還不夠完善,因爲源在新環境中終止(即將R提示會變爲Browser[1]>而非>)。我們仍然可以按Q退出它,但我正在尋找直接的方法。

另一種選擇是使用if (! justUpdate) { main body }但它解決了問題,而不是解決它。

有沒有更好的選擇?

+0

你能詳細說明你正在做什麼,爲什麼?這可以幫助我們幫助你。 –

+0

@joran我不想關閉所有的錯誤信息 – Ali

+4

要麼1)把你的函數定義放在一個單獨的文件中(或者更好的是,一個包)從你的程序中更新, ;或2)使用'if(!justUpdate){...}'。我建議1)。你目前想要做的是一個令人困惑的方式來組織你的代碼。 –

回答

6

您在尋找功能browser

+1

謝謝,'瀏覽器'是一個不錯的選擇,但並不完美。當我把它放在源代碼中時,程序從我想要的行成功停止,但是提示符改變爲「Browser [1]>」而不是「>」,這意味着在新的環境中。我只想簡單地使用相同的環境我的源代碼正常完成 – Ali

+0

只需在該提示符處鍵入'Q'即可關閉瀏覽器提示並返回主提示符... –

+0

@PaulHiemstra謝謝我更新了這個問題,有沒有更方便的想法? – Ali

6

有一個郵件列表here定義了stopQuietly功能,基本上隱藏stop功能顯示的錯誤一個很好的解決方案:

stopQuietly <- function(...) { 
    blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" ")); 
    stop(simpleError(blankMsg)); 
} # stopQuietly() 

> stopQuietly() 
+0

這個解決方案使用真棒。謝謝! – drmariod

3

我發現了一個相當巧妙的解決辦法here。訣竅是在調用stop()之前關閉所有錯誤消息。函數on.exit()用於確保錯誤消息之後再次打開。功能如下所示:

stop_quietly <- function() { 
    opt <- options(show.error.messages = FALSE) 
    on.exit(options(opt)) 
    stop() 
} 

第一行關閉錯誤消息並將舊設置存儲到變量opt。在此行之後,發生的任何錯誤都不會輸出消息,因此stop()也不會導致打印任何消息。

根據R幫助,

on.exit記錄給出其爲需要的參數表達的當前功能退出時被執行。

當前函數是stop_quietly(),它在調用stop()時退出。所以程序所做的最後一件事是撥打options(opt),它會在調用stop_quietly()(假定但不一定是TRUE)之前將show.error.messages設置爲其具有的值。

2

我有一個類似的問題,基於@VangelisTasoulas答案,我得到了一個簡單的解決方案。
內部函數,我必須檢查數據庫是否更新。如果不是,請停止執行。

r=readline(prompt="Is DB updated?(y/n)") 
Is DB updated?(y/n)n 
if(r != 'y') stop('\r Update DB') 
Update DB 

只是把\r在郵件的開頭,在消息中覆蓋Error: