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

标签 r error-handling try-catch sleep

我有两个关于 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 秒。

谢谢

最佳答案

正如@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 的更详细说明.

关于r - 跳过 R for 循环中的错误,并在每次迭代中暂停该过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49834055/

相关文章:

Java 8 - 有效的最终变量、lambdas 和 try/catch/finally block

r - 如何使用 tikz 环境和 knit 在 R 图中书写希腊字母?

r - 如何使用 R 获取图中的行和列的总和

r - 根据增加或减少值更改点的颜色

php - 警告: count(): Parameter must be an array or an object that implements Countable in C:\xampp\htdocs\m2\my booking.php on line 158

error-handling - 如何返回包含结果迭代器的每个错误的结果,而不仅仅是第一个错误?

python - 在python中实现循环队列-级别标准

R 顶部 Shiny 的 DT 复选框可勾选/取消勾选下面的所有复选框

vb.net - 同时捕获多个异常

c# - 为什么 try {...} finally {...} 好;试试 {...} catch{} 不好?