RShiny для вызова API, перехвата ошибок API и остановки l oop без сбоя приложения - PullRequest
0 голосов
/ 30 апреля 2020

Я создал приложение Shiny для вызова и получения данных из API, который предоставляет данные о погоде.

Заранее извиняюсь, потому что я не смогу дать функциональный код, так как я работаю над 5 различными сценариями, потому что приложение огромно.

Вот моя проблема, мне дают в качестве входных данных, в дополнение к этому, я прошу пользователя выбрать интересующие его переменные погоды.

Затем я строю свой запрос в JSON, а затем отправляю их один за другим (нужен API) API.

Иногда происходит сбой API (это разрабатываемая версия), и я хотел бы показать пользователю, что произошел сбой API без самого приложения.

Поэтому я протестировал несколько методы, и я сейчас пытаюсь интегрировать все в какое-то время l oop, из которого мы выходим, когда условие "flag ==" continue "" после * кода, если все прошло хорошо, или "flag == FALSE", если мы должны выйти из l oop, и в этом случае мы показываем сообщения пользователю (либо API cra sh, либо ошибка в данных).

Проблема в том, что я не могу останови л oop, даже если у меня есть ошибка API, то отправляются следующие запросы, а остальная часть кода выполняется до тех пор, пока приложение не выйдет из строя.

Я не знаю, связана ли проблема со структурой моего кода или с предпосылками Shiny. Я начал Shiny это только 10 дней go.

Спасибо всем вам.

 observeEvent(input$finalConfirm, {
      ns <- session$ns
      data = as.data.frame(dataCEHUB())
      query = requeteCEHUB()
      print(query)

      withProgress(message = 'Dowload in progress', {
        Sys.sleep(1)
        N = length(query)
        l = list()
        flag = TRUE 
        i =1 
        while(flag != FALSE | flag !="continue"){
          #for (i in 1:length(query)){
            a = postQuery(data = data,queries = query[[i]])
            print(class(a))
            print(length(a))

            if (class(a)!="character"){
              l[[i]] = a
              incProgress(1/N)
              i= i+1

              if(i == N){
                flag = "continue"
              }
            }

            else if (a == "APIissue") {
              flag= FALSE
              incProgress(N)
              remove_modal_spinner()
              shinyalert("Informations","Oops it seems that CE HUB has encontred an issue, wait few seconds and try to relaunch the request by cliking again on the button", type = "warning")
              l = list()
              }

            else{ #(!is.data.frame(a) | a != "APIissue")
              flag = FALSE
              incProgress(N)
              remove_modal_spinner()
              shinyalert("Error",HTML(paste0("Oops it seems that CE HUB found an error with the data provided: <br>",
                                    '<p style="text-align:left;">The error is the following one :<br>',
                                          a, "<br> If you can't understand the error please contact someone from data science office </p>" ))
                                  , type = "error", html = T)
              l = list()
            }
          }
        #}
      })

        if (flag == "continue"){
          remove_modal_spinner()
          if(length(l)>0){
            listDataCEHUB <- l
            print(l)
            DataWeatherDownloaded = listDataCEHUB%>%purrr::reduce(left_join)
            show_modal_spinner(spin = "cube-grid", color = "red" ,text = HTML("<br>DATA CONSTRUCTION IN PROGRESS.."))
            DataWeatherTransformed <- prepMeteo(dataWeather = DataWeatherDownloaded)
            if (length(grep("CumSum",colnames(DataWeatherTransformed)))!=0){
              shinyalert("Informations", HTML(paste0('<p style="text-align:left;">',"Some new variables have been calculated :<br><br>",
                                                     "- 'Cumulated Sum' for aggregated by sum variables requested<br>",
                                                     "- 'Day_gap' from the first to the last date for each year-location combinations</p>"
              )), type = "info", html = T)
            }
            else{shinyalert("Informations", HTML(paste0('<p style="text-align:left;">A new variable have been calculated :<br><br>',
                                                        "- 'Day_gap' from the first to the last date for each year-location combinations </p>"
                              )), type = "info", html = T)}
            }
            output$DataWeatherTransformed <- DT::renderDataTable(DataWeatherTransformed, options = list(scrollX = T), rownames = F)
            rv$dataTrans = DataWeatherTransformed
            remove_modal_spinner()

            output$downloadDataCEHUB <- downloadHandler(
              filename = function() {
                paste0('weather_data_CEHUB_', Sys.Date(), '.csv')
              },
              content = function(con) {
                write.csv(rv$dataTrans,con, row.names = F,fileEncoding = "UTF-8" )
              }
            )

            }
      })

...