2013-01-08 50 views
3

我使用的代碼可以計算語法錯誤,並報告程序運行後語法錯誤的數量。錯誤計數代碼是在stackoverflow上提供的,以迴應我之前的問題:R: is there a command for the end of a file that states whether any errors occurred?程序運行後定位錯誤

有時我忘記在分析大型數據集時註釋掉打印消息,而R無法打印所有數據和所有代碼。

[ reached getOption("max.print") -- omitted 498 rows ] 

發生這種情況時,錯誤計數代碼報告錯誤,我不能簡單地向上滾動以查看錯誤是什麼。在R代碼運行後有沒有找到錯誤的方法?我嘗試使用traceback(),但它沒有幫助。我從來沒有使用traceback(),也許我沒有正確使用它。我在網上找到的其他潛在解決方案似乎需要在運行R文件之前插入代碼。

我可以重新運行R代碼並將print命令註釋掉,但在這種情況下代碼需要幾個小時才能運行。也許我可以用較小的數據集快速重新運行代碼以找到錯誤,但是假設數據集的大小不會以某種方式導致錯誤。

這是一個包含錯誤的示例程序。如果n被更改爲一個很大的數字,也許是10000000,那麼這段代碼看起來會創建與我上面描述的類似的場景或場景。感謝您的任何建議。

我通常通過將其保存在* .r文件中來運行我的代碼,然後複製該文件的內容並將其粘貼到安裝在我的Dell PC 64位Windows 7 Professional桌面上的默認R GUI中R應用程序。

# the four lines below are for counting syntax errors 

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

########################################################## 

n <- 10 

a <- rnorm(n,10,4) 
b <- rnorm(n,50,8) 
c <- EXP(b) 
d <- a + b 

df <- data.frame(a,b,d) 
df 

########################################################## 

# the three lines below count the number of errors in the code above 

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

########################################################## 

traceback() 

# No traceback available 

回答

1

這是一個只能在交互模式下工作的選項,AFAICT。

修改你的序言中寫錯誤信息到錯誤日誌變量:

.error.log <- NULL 
old.error.fun <- getOption("error") 

new.error.fun <- quote({ 
    .error.count <- .error.count + 1 
    .error.log <- c(.error.log, geterrmessage()) 
}) 

然後運行你的代碼和cat()錯誤日誌的值:

cat("ERROR COUNT:", .error.count, "\n") 
cat("ERROR LOG:", .error.log, collapse="\n") 

結果:

> cat("ERROR COUNT:", .error.count, "\n") 
ERROR COUNT: 1 
> cat("ERROR LOG:", .error.log, collapse="\n") 
ERROR LOG: Error: could not find function "EXP" 
1

這是一個稍微不同的方法,使用local函數來創建一個包含日誌的錯誤記錄器。

error.logger <- local({ 
    error.log <- list() # initial empty log 
    function() { 
     # each time called, add to the log 
     error.log <<- c(error.log, geterrmessage()) 
    } 
}) 

options(error=error.logger, show.error.locations=TRUE) 

這是基本相同Andrie的做法,但避免了全局變量.error.log。您可以通過get('error.log', environment(error.logger))訪問日誌。 show.error.locations=TRUE將在您的錯誤消息中包含源代碼行號。

無論您處於交互模式還是批處理模式,此功能都可以使用。

+0

謝謝你的回覆。我本可以給這個複選標記發佈,但只是因爲他的回答對我來說更清楚一些而給了Andrie。我喜歡在日誌中包含源代碼行號的功能,但無法弄清楚如何執行此操作。 –

+0

我不認爲'options(show.error.locations = TRUE)'被添加到R 2.15。確保你的R版本是最新的。否則,設置此選項時,R將在錯誤消息中包含行號。 –