2012-02-18 30 views
1

有時當我運行很多長程序時,我認爲如果有一個語句或命令可以添加到文件的底部,它會告訴我R在運行時是否返回任何錯誤消息(或警告消息)一份文件。R:是否有一個文件結尾的命令,指出是否發生錯誤?

我總是向上滾動瀏覽所有代碼,以便直觀地檢查錯誤消息或警告,並且一直認爲如果R只是在代碼的底部告訴我是否發生了錯誤消息或警告,它會很好。

R可以嗎?我猜想,即使R可以這樣做,我需要一段時間才能在命令行中開發信任來捕獲所有錯誤消息或警告消息。

使用SAS我曾使用find命令並在日誌窗口中搜索單詞'Error'或'Warning'。

感謝您對此的任何想法或建議。

這是R代碼的一個非常簡單的例子,它返回3個錯誤消息。

x <- c(1,2,3,4) 
y <- c(3,4) 
z <- x/y 
zz 
a <- matrix(x, nrow=2, byrow=T) 
b <- matrix(x, nrows=2, byrow=T) 
z x a 
z * a 
+0

對於我來說,如何運行這個代碼(它是一個腳本,一個源代碼文件等?),但您可能會看到options()的'error'組件。看看?選項。你可以用一個遞增計數器的函數重新定義它,然後在腳本的末尾有東西返回計數器的值。 – flodel 2012-02-18 00:54:14

+0

我通常在文本編輯器中編寫所有的R代碼。當我完成R代碼的複製時,打開R並同時將所有代碼粘貼到R中。我一定會看看選項'命令'。謝謝。 – 2012-02-18 01:11:34

回答

4

我假設你從GUI運行,其中錯誤不是致命的。這是一個使用選項(錯誤)的解決方案。錯誤處理程序通過增加變量的函數代替:

.error.count <- 0 
old.error.fun <- getOption("error") 
new.error.fun <- quote(.error.count <- .error.count + 1) 
options(error = new.error.fun) 

### your code here ### 
x <- c(1,2,3,4) 
y <- c(3,4) 
z <- x/y 
zz 
a <- matrix(x, nrow=2, byrow=T) 
b <- matrix(x, nrows=2, byrow=T) 
z x a 
z * a 
###################### 

cat("ERROR COUNT:", .error.count, "\n") 
options(error = old.error.fun) 
rm(.error.count, old.error.fun, new.error.fun) 
+0

所有這些答案看起來非常有幫助。我會研究它們中的每一個。謝謝。 – 2012-02-18 01:18:58

1

這不是一個好的例子,因爲當我運行它時,它會停在第一個錯誤上。但是,一般問題可能更好地由OS和標準文件描述符解決。具體來說,R會將其正常輸出輸出到stdout,並將其警告和錯誤輸出到stderr,並且您可以單獨處理這些流而不是將它們看在一起。例如,您可以發送標準輸出到一個文件,並保持標準錯誤終端:

Rscript myfile.R 1>output.txt 
+0

謝謝。我會看看那個。 – 2012-02-18 01:13:51

1

我主要用source()運行代碼得到這個功能;即只轉儲你的代碼到一個文件,然後運行:

Error in source("yourscript.r") : yourscript.r:7:3: unexpected symbol 
6: b <- matrix(x, nrows=2, byrow=T) 
7: z x 
    ^

它不會在一個傳回所有的錯誤 - 語法錯誤將停止:

source("yourscript.r") 
在R,返回

文件完全不執行,不像checkorbored的Rscript方法運行,然後給你第一個錯誤(更多細節見?source)。但它可能符合你的目的。

0

類似@checkorboard

什麼,我要做的就是把代碼中的一個文本文件,說「yourscript.r」,然後運行:

R CMD BATCH yourscript.r & 

這將自動創建一個類似與程序的輸出yourscript.rout一個文件,你可以很容易地grep,看看是否出現了錯誤。