如何从MODISTools中的超时错误中恢复

时间:2018-06-22 00:03:47

标签: r error-handling

我很高兴使用MODISTools在时间和空间上下载图像匹配。具体来说,MODISTools正在查找叶面积指数,以查找另一颗卫星进行的一百万个相关观测。如警告所示,NASA服务器会定期超时。

当发生这种情况时,我希望r捕获错误,请稍等(如果需要),然后重试。我知道等待时间不必超过几秒钟,因为我正在运行多个实例,并且一次只有一个或两个超时。一旦检测到错误,就可以通过重试相同的步骤来恢复处理,或者通过重新开始下面粘贴的序列来实现基本相同的效果。有没有简单的方法可以做到这一点?如果涉及从r调用服务器命令,请写下您的答案以作答!

这是一个例子,尽管没有造成超时,但这并不能说明什么。为简单起见,我显示固定的位置和日期。实际上,它们来自my.chunk数据框中的其他字段。

 look.these.up <- which(is.na(my.chunk$lai))
 for (m.obs in look.these.up) {
      junk <- mt_subset(product = "MOD15A2H", lon = 5, lat = 5,
           start = "2017-01-01", end = "2017-01-08")
      my.chunk$lai[m.obs] <- junk$data[, "data"][5] 
 }

1 个答案:

答案 0 :(得分:0)

这对我有用。我抬头看了一下。How can I view the source code for a function?如何查看mt_subset命令后面的代码并进行了修改。

由于我需要的MODIS数据子集有限,因此可以进行一些简化,例如在for循环外创建all.date并删除大部分输入错误检查。

 for (m.obs in 1:n.obs) {
    modis.date <- all.dates[which(all.dates$calendar_date <= 
       ret.date & all.dates$calendar_date >= (ret.date - 7)), 1][1]

 ## Retrieve the MODIS values for the obs time & place
 m.response <- httr::GET(
    url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
    query = list(latitude = my.chunk$lat[m.obs], 
       longitude = my.chunk$lon[m.obs],   
       startDate = modis.date, endDate = modis.date,
       kmAboveBelow = 0, kmLeftRight = 0),
    httr::write_memory())
    ## If connection fails, try it again up to 10 times.   
    attempts = 0
    while (httr::http_error(m.response)) {
       attempts = attempts + 1
       print(paste0("retry # ", attempts))
       if (attempts >= 10) {
          stop()
          m.response <- NULL
       } 
       Sys.sleep(1) # seconds
       m.response <- httr::GET(
          url = "https://modis.ornl.gov/rst/api/v1/MOD15A2H/subset", 
          query = list(latitude = my.chunk$lat[m.obs], 
             longitude = my.chunk$lon[m.obs],   
             startDate = modis.date, endDate = modis.date,
             kmAboveBelow = 0, kmLeftRight = 0),
          httr::write_memory())
    }   
   modis.vals <- jsonlite::fromJSON(httr::content(m.response,
      "text", encoding = "UTF-8"), 
       simplifyVector = TRUE)$subset[, "data"]  # decodes returned data
   my.chunk$fpar[m.obs] <- modis.vals[[6]] # fPar

   etc.
}