在R中导入JSON文件时忽略错误

时间:2019-07-04 17:51:29

标签: r try-catch jsonlite

我有这个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上找不到的某个关键字,然后返回此错误:

Error in open.connection(con, "rb") : HTTP error 400.

然后循环停止。

有没有办法忽略错误并继续循环?

我已经使用tryCatch阅读了一些内容,但仍然无法弄清。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

对于这种任务,我偏爱purrr的safely,在purrr的map函数中效果很好。您可以通过从GitHub的API获取JSON进行测试:

keywords <- c("hadley", "gershomtripp", "lsjdflkaj")
url <- "https://api.github.com/users/{.}/repos"

现在我们可以获取JSON并提取回购ID

library(jsonlite)
library(purrr)
library(glue)

json_list <- map(keywords, safely(~ fromJSON(glue(url)) %>% .$id))

这将返回包含resulterror的元素的列表。如果有错误,它将被保存在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.>