[R] 如何在循環(huán)語句中處理Error?

前言

在循環(huán)語句中遇到錯誤而使得腳本運行中斷是一件十分頭疼的事,尤其是面對高耗時的任務(wù)時更是如此,因此在循環(huán)語句中考慮對錯誤情形的處理非常有必要。在R語言中,主要有兩個方案可以對運行中出現(xiàn)的錯誤進(jìn)行處理,它們分別是try語句和tryCatch語句。

方案一:使用try語句

  1. 使用方法
    在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)行下一步的處理。

  1. 使用示例
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語句

  1. 使用方法
    相較于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
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容