【问题标题】:Ignore error when importing JSON files in R在 R 中导入 JSON 文件时忽略错误
【发布时间】:2019-07-04 17:51:29
【问题描述】:

我有这个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 阅读了一些内容,但仍然无法弄清楚。

【问题讨论】:

    标签: r try-catch jsonlite


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      对于这类任务,我偏爱 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))
      

      这将返回包含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.>
      

      【讨论】:

        猜你喜欢
        • 2012-07-01
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 2022-08-05
        • 2020-12-10
        • 2017-05-29
        • 1970-01-01
        • 2017-01-01
        相关资源
        最近更新 更多