前言
在循環(huán)語句中遇到錯誤而使得腳本運行中斷是一件十分頭疼的事,尤其是面對高耗時的任務(wù)時更是如此,因此在循環(huán)語句中考慮對錯誤情形的處理非常有必要。在R語言中,主要有兩個方案可以對運行中出現(xiàn)的錯誤進(jìn)行處理,它們分別是try語句和tryCatch語句。
方案一:使用try語句
- 使用方法
在R語言中,try語句的用法如下所示:
try(expr, silent = FALSE,
outFile = getOption("try.outFile", default = stderr()))
可以看到,try語句共有三個參數(shù),常用的是前兩個參數(shù)。第一個參數(shù)expr為我們所要使用的表達(dá)式,第二個參數(shù)silent表示當(dāng)錯誤出現(xiàn)時是否需要報告錯誤信息,其輸入值應(yīng)為邏輯變量,默認(rèn)為FALSE,即選擇不保持“沉默”,當(dāng)錯誤出現(xiàn)時會立即報告錯誤信息。
如果參數(shù)expr所代表的表達(dá)式可以正確運行,則try語句的輸出即為該表達(dá)式的運行結(jié)果,如果表達(dá)式無法正確運行,則try語句會輸出一個“try-error”類的不可見對象,因此可以通過if語句對try語句的輸出結(jié)果進(jìn)行判斷從而進(jìn)行下一步的處理。
- 使用示例
A = list(a=1,b='abc',c=-2,d=3) # 運行l(wèi)og('abc')會報錯,運行l(wèi)og(-2)會出現(xiàn)警告
B = list()
for (nm in names(A))
{
x <- A[[nm]]
temp <- try(log(x),silent=FALSE)
if('try-error' %in% class(temp)) # 判斷當(dāng)前循環(huán)的try語句中的表達(dá)式是否運行正確
{
temp <- NA # 此處可以對運行錯誤的情況進(jìn)行處理應(yīng)對
}
B[[nm]] <- temp
}
方案二:使用tryCatch語句
- 使用方法
相較于try語句,tryCatch語句更為全面,能夠處理和應(yīng)對更為復(fù)雜的問題。其不僅能夠處理表達(dá)式出現(xiàn)錯誤error的情形,還能夠處理出現(xiàn)警告warning的情況。主要用法如下所示:
tryCatch(
{ expr },
warning = function(w) { warning-handler-code },
error = function(e) { error-handler-code },
finally = { cleanup-code }
)
可以看到,tryCatch語句的內(nèi)部可以被劃分為四個不同的部分。
第一個部分{ expr }為所要運行的表達(dá)式;
第二個部分warning = function(w) { warning-handler-code }用于處理第一個部分出現(xiàn)警告warning時的情況;
第三個部分error = function(e) { error-handler-code }用于處理第一個部分出現(xiàn)錯誤error時的情況;
第四個部分finally = { cleanup-code }用于最后收尾,不管前面是否出現(xiàn)警告warning或者錯誤error,該部分的代碼都會被執(zhí)行。
除了第一個部分不可缺省之外,其他幾個部分都可以根據(jù)實際需要進(jìn)行使用。
2.使用示例
A = list(a=1,b='abc',c=-2,d=3) # 運行l(wèi)og('abc')會報錯,運行l(wèi)og(-2)會出現(xiàn)警告
B = list()
for (nm in names(A))
{
x <- A[[nm]]
temp <- tryCatch(
{ log(x) },
warning = function(w) { message('Waring @ ',x) ; return(NA) },
error = function(e) { message('Error @ ',x) ; return(NA) },
finally = { message('next...') }
)
B[[nm]] <- temp
}