2015-07-13 81 views
0

我想讀取幾個url文件。有誰知道如何檢查,如果它可以打開網址,然後做點什麼?有時我收到錯誤(失敗=「無法打開連接」)。如果無法打開連接,我只想跳過它。失敗 - 「無法打開連接」

urlAdd=paste0(server,siteID,'.dly') 
# Reading the whole data in the page 
if(url(urlAdd)) { 
    tmp <- read.fwf(urlAdd,widths=c(11,4,2,4,rep(c(5,1,1,1),31))) 
} 

但是這種情況失敗了。

+0

含咖啡因的答案是好的。另請參閱http://stackoverflow.com/questions/31115045/how-to-handle-errors-while-reading-xml-files-r/31115268#31115268 for _robustify_ – hrbrmstr

回答

0

如果成功,您可以使用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 )。

+0

我正在使用lapply進行循環。 next()是否也適用於lapply? – newbie

+0

謝謝,它現在正在工作。 – newbie

相關問題