代码之家  ›  专栏  ›  技术社区  ›  Behzod A

跳过R for循环中的错误,并在每次迭代中暂停进程

  •  0
  • Behzod A  · 技术社区  · 6 年前

    我有两个关于循环的问题 R

    1) 我正在使用 XML 打包从网站中删除一些表,并使用 rbind 。我正在使用以下命令,如果给定网站中存在价格数据和表格,它将正常工作。

    url.list <- c("www1", "www2", "www3")
    
    for(url_var in url.list)
    {
      url <- url_var
      url.parsed <- htmlParse(getURL(url), asText = TRUE)
      tableNodes <- getNodeSet(url.parsed, '//*[@id="table"]/table')
      newdata <- readHTMLTable(tableNodes[[1]], header=F, stringsAsFactors=F)
      big.data <- rbind(newdata,  big.data)
      Sys.sleep(30)
    }
    

    但有时网页没有相应的表(在这种情况下,我只剩下一个变量表,其中包含以下消息: No current prices reported. )并且我的循环停止,并显示以下错误消息(因为表列数不匹配):

     Error in rbind(deparse.level, ...) : 
      numbers of columns of arguments do not match 
    

    我想要 R 忽略错误并继续下一个网页(跳过具有不同列数的网页)。

    2) 在循环的最后我有 Sys.sleep(30) .是否强制 R 在尝试下一个网页之前等待30秒。

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   ytu    6 年前

    正如@RuiBarradas在评论中提到的, tryCatch 是我们在R中处理错误(甚至警告)的方式。特别是在您的情况下,您需要的是在出现错误时进行下一次迭代,因此您可以这样做:

    for (url_var in url.list) {
        url <- url_var
        url.parsed <- htmlParse(getURL(url), asText = TRUE)
        tryCatch({
            # Try to run the code within these braces
            tableNodes <- getNodeSet(url.parsed, '//*[@id="table"]/table')
            newdata <- readHTMLTable(tableNodes[[1]], header=F, stringsAsFactors=F)
            big.data <- rbind(newdata,  big.data)
        },
            # If there are errors, go to next iteration
            # Sys.sleep(30) won't be executed in such case
            error = next())
        Sys.sleep(30)
    }
    

    是的, Sys.sleep(30) 执行时使R休眠30秒。因此,如果您希望R在每次迭代中总是休眠,无论解析是否成功,您可以考虑将该行移到 tryCatch公司

    请参阅 How to write trycatch in R 更详细地阐述 tryCatch公司