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

Skip errors in R for loops and also pause the process in each iteration

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

1) 我正在使用 XML 包从网站上删除一些 table 并使用 rbind 组合它们。我正在使用以下命令,如果给定网站中存在价格数据和 tables,它可以正常工作。

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)
}

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

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

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

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

谢谢

正如@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 的更详细阐述。