前言
在循環(huán)語句中遇到錯(cuò)誤而使得腳本運(yùn)行中斷是一件十分頭疼的事庙睡,尤其是面對(duì)高耗時(shí)的任務(wù)時(shí)更是如此事富,因此在循環(huán)語句中考慮對(duì)錯(cuò)誤情形的處理非常有必要技俐。在R語言中,主要有兩個(gè)方案可以對(duì)運(yùn)行中出現(xiàn)的錯(cuò)誤進(jìn)行處理赵颅,它們分別是try語句和tryCatch語句虽另。
方案一:使用try語句
- 使用方法
在R語言中,try語句的用法如下所示:
try(expr, silent = FALSE,
outFile = getOption("try.outFile", default = stderr()))
可以看到饺谬,try語句共有三個(gè)參數(shù)捂刺,常用的是前兩個(gè)參數(shù)。第一個(gè)參數(shù)expr
為我們所要使用的表達(dá)式募寨,第二個(gè)參數(shù)silent
表示當(dāng)錯(cuò)誤出現(xiàn)時(shí)是否需要報(bào)告錯(cuò)誤信息族展,其輸入值應(yīng)為邏輯變量,默認(rèn)為FALSE
拔鹰,即選擇不保持“沉默”仪缸,當(dāng)錯(cuò)誤出現(xiàn)時(shí)會(huì)立即報(bào)告錯(cuò)誤信息。
如果參數(shù)expr
所代表的表達(dá)式可以正確運(yùn)行列肢,則try語句的輸出即為該表達(dá)式的運(yùn)行結(jié)果恰画,如果表達(dá)式無法正確運(yùn)行,則try語句會(huì)輸出一個(gè)“try-error”類的不可見對(duì)象瓷马,因此可以通過if語句對(duì)try語句的輸出結(jié)果進(jìn)行判斷從而進(jìn)行下一步的處理拴还。
- 使用示例
A = list(a=1,b='abc',c=-2,d=3) # 運(yùn)行l(wèi)og('abc')會(huì)報(bào)錯(cuò),運(yùn)行l(wèi)og(-2)會(huì)出現(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á)式是否運(yùn)行正確
{
temp <- NA # 此處可以對(duì)運(yùn)行錯(cuò)誤的情況進(jìn)行處理應(yīng)對(duì)
}
B[[nm]] <- temp
}
方案二:使用tryCatch語句
- 使用方法
相較于try語句欧聘,tryCatch語句更為全面片林,能夠處理和應(yīng)對(duì)更為復(fù)雜的問題。其不僅能夠處理表達(dá)式出現(xiàn)錯(cuò)誤error的情形怀骤,還能夠處理出現(xiàn)警告warning的情況费封。主要用法如下所示:
tryCatch(
{ expr },
warning = function(w) { warning-handler-code },
error = function(e) { error-handler-code },
finally = { cleanup-code }
)
可以看到,tryCatch語句的內(nèi)部可以被劃分為四個(gè)不同的部分蒋伦。
第一個(gè)部分{ expr }
為所要運(yùn)行的表達(dá)式弓摘;
第二個(gè)部分warning = function(w) { warning-handler-code }
用于處理第一個(gè)部分出現(xiàn)警告warning時(shí)的情況;
第三個(gè)部分error = function(e) { error-handler-code }
用于處理第一個(gè)部分出現(xiàn)錯(cuò)誤error時(shí)的情況凉敲;
第四個(gè)部分finally = { cleanup-code }
用于最后收尾衣盾,不管前面是否出現(xiàn)警告warning或者錯(cuò)誤error,該部分的代碼都會(huì)被執(zhí)行爷抓。
除了第一個(gè)部分不可缺省之外势决,其他幾個(gè)部分都可以根據(jù)實(shí)際需要進(jìn)行使用。
2.使用示例
A = list(a=1,b='abc',c=-2,d=3) # 運(yùn)行l(wèi)og('abc')會(huì)報(bào)錯(cuò)蓝撇,運(yùn)行l(wèi)og(-2)會(huì)出現(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
}