在 R 中导入 JSON 文件时忽略错误
Ignore error when importing JSON files in R
我有这个 for
循环,它从 solr
搜索服务器下载 json 文件。
它遍历包含关键字(在本例中为 100)的向量:
library(jsonlite)
for (i in 1:100) {
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
}
它工作正常,直到它到达在 solr 上找不到的某个关键字,并且 returns 这个错误:
Error in open.connection(con, "rb") : HTTP error 400.
然后循环停止。
有没有办法忽略错误并继续循环?
我已经使用 tryCatch
阅读了一些内容,但仍然无法理解。
比tryCatch
简单,您可以在关键字循环中使用函数try
。这将尝试加载 URL,但如果遇到错误,将打印错误但继续下一个关键字。
library(jsonlite)
for (i in 1:100) {
try({
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
})
}
如果您也不希望打印错误,请指定 silent = TRUE
:
library(jsonlite)
for (i in 1:100) {
try({
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
}, silent = TRUE)
}
对于这种任务,我偏向于 purrr 的 safely
,它在 purrr 的地图函数中运行良好。您可以通过从 GitHub 的 API:
获取 JSON 来测试它
keywords <- c("hadley", "gershomtripp", "lsjdflkaj")
url <- "https://api.github.com/users/{.}/repos"
现在我们可以获取 JSON 并提取 repo ID
library(jsonlite)
library(purrr)
library(glue)
json_list <- map(keywords, safely(~ fromJSON(glue(url)) %>% .$id))
这将 return 包含 result
和 error
的元素列表。如果出现错误,它将保存在 error
中,否则结果将保存在 result
.
中
[[1]]
[[1]]$result
[1] 40423928 40544418 14984909 12241750 5154874 9324319 20228011 82348 888200 3116998
[11] 8296284 137344416 133734429 2788278 28724058 9470424 116708612 34325557 41144 41157
[21] 78543290 66588778 35225488 14507273 15718805 18562209 12522 115742443 119107571 201908
[[1]]$error
NULL
[[2]]
[[2]]$result
[1] 150995700 141743224 127107806 130802586 185857872 131488780 148619375 165221804 135417803 127116088
[11] 181662388 173351888 127131146 136896011
[[2]]$error
NULL
[[3]]
[[3]]$result
NULL
[[3]]$error
<simpleError in open.connection(con, "rb"): HTTP error 404.>
我有这个 for
循环,它从 solr
搜索服务器下载 json 文件。
它遍历包含关键字(在本例中为 100)的向量:
library(jsonlite)
for (i in 1:100) {
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
}
它工作正常,直到它到达在 solr 上找不到的某个关键字,并且 returns 这个错误:
Error in open.connection(con, "rb") : HTTP error 400.
然后循环停止。
有没有办法忽略错误并继续循环?
我已经使用 tryCatch
阅读了一些内容,但仍然无法理解。
比tryCatch
简单,您可以在关键字循环中使用函数try
。这将尝试加载 URL,但如果遇到错误,将打印错误但继续下一个关键字。
library(jsonlite)
for (i in 1:100) {
try({
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
})
}
如果您也不希望打印错误,请指定 silent = TRUE
:
library(jsonlite)
for (i in 1:100) {
try({
docs <- fromJSON(paste("http://myurl.com/solr/select?df=topic&fq=",keywords[i],"&indent=on&q=*:*&rows=1&wt=json",sep=""))
numFound <- docs$response$numFound
print(numFound)
}, silent = TRUE)
}
对于这种任务,我偏向于 purrr 的 safely
,它在 purrr 的地图函数中运行良好。您可以通过从 GitHub 的 API:
keywords <- c("hadley", "gershomtripp", "lsjdflkaj")
url <- "https://api.github.com/users/{.}/repos"
现在我们可以获取 JSON 并提取 repo ID
library(jsonlite)
library(purrr)
library(glue)
json_list <- map(keywords, safely(~ fromJSON(glue(url)) %>% .$id))
这将 return 包含 result
和 error
的元素列表。如果出现错误,它将保存在 error
中,否则结果将保存在 result
.
[[1]]
[[1]]$result
[1] 40423928 40544418 14984909 12241750 5154874 9324319 20228011 82348 888200 3116998
[11] 8296284 137344416 133734429 2788278 28724058 9470424 116708612 34325557 41144 41157
[21] 78543290 66588778 35225488 14507273 15718805 18562209 12522 115742443 119107571 201908
[[1]]$error
NULL
[[2]]
[[2]]$result
[1] 150995700 141743224 127107806 130802586 185857872 131488780 148619375 165221804 135417803 127116088
[11] 181662388 173351888 127131146 136896011
[[2]]$error
NULL
[[3]]
[[3]]$result
NULL
[[3]]$error
<simpleError in open.connection(con, "rb"): HTTP error 404.>