Игнорировать ошибку при импорте файлов JSON в R - PullRequest
0 голосов
/ 04 июля 2019

У меня есть цикл for, который загружает файл json с solr поискового сервера.Он зацикливается на векторе, который содержит ключевые слова (в данном случае 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 голосов
/ 04 июля 2019

Я неравнодушен к мурлыканью safely для такого рода задач, которые хорошо работают в функциях карт мурлыкания. Вы можете проверить это, получив JSON из API GitHub:

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

Теперь мы можем получить JSON и извлечь идентификаторы репо

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

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

Это вернет список элементов, содержащих 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.>
0 голосов
/ 04 июля 2019

Проще, чем 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)
}
...