跳过 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
的更详细阐述。
我有两个关于 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
的更详细阐述。