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