如果成功,您可以使用tryCatch
返回表達式的值,如果出現錯誤,則返回error
參數的值。見?tryCatch
。
本示例查找一堆URL並下載它們。如果成功,tryCatch
將返回readlines
的結果,如果不成功則返回NULL
。如果結果是NULL
我們只需next()
到循環的下一部分。
urls <- c('http://google.com', 'http://nonexistent.jfkldasf', 'http://stackoverflow.com')
for (u in urls) {
# I only put warn=F to avoid the "incomplete final line" warning
# you put read.fwf or whatever here.
tmp <- tryCatch(readLines(url(u), warn=F),
error = function (e) NULL)
if (is.null(tmp)) {
# you might want to put some informative message here.
next() # skip to the next url.
}
}
注意這將這樣做對任何錯誤,不只是一個「找不到404」型錯誤。如果我輸入並寫下tryCatch(raedlines(url(u), warn=F)
(readLines
上的錯字),它會跳過所有內容,因爲這也會導致錯誤。
編輯re:評論(lapply
正在使用,在哪裏放數據處理代碼)。而不是next()
,只有在讀取成功時才進行處理。在讀取數據代碼之後放入數據處理代碼。嘗試是這樣的:
lapply(urls,
function (u) {
tmp <- tryCatch(read.fwf(...), error = function (e) NULL)
if (is.null(tmp)) {
# read failed
return() # or return whatever you want the failure value to be
}
# data processing code goes here.
})
以上返回了功能,如果讀取失敗(僅影響的lapply
當前元素)。
或者你可以反其道而行,做類似:
lapply(urls,
function (u) {
tmp <- tryCatch(read.fwf(...), error = function (e) NULL)
if (!is.null(tmp)) {
# read succeeded!
# data processing code goes here.
}
})
這將做同樣的(它只做你的數據處理代碼,如果讀取成功,否則跳過的代碼,整個街區,並返回NULL
)。
含咖啡因的答案是好的。另請參閱http://stackoverflow.com/questions/31115045/how-to-handle-errors-while-reading-xml-files-r/31115268#31115268 for _robustify_ – hrbrmstr