Этот скрипт представляет собой приложение Shiny, которое позволяет пользователю выбрать муниципалитет в Латвии из выпадающего меню и просмотреть текущий прогноз погоды и температуры для этого муниципалитета.
library(shiny) library(jsonlite) library(httr) library(plotly) # Create a vector of municipalities in Latvia municipalities <- c("Aglona", "Aizkraukle", "Aizpute", "Akniste", "Aloja", "Alsunga", "Aluksne", "Amata", "Ape", "Auce", "Babite", "Baldone", "Baltinava", "Balvi", "Bauska", "Broceni", "Carnikava", "Cesvaine", "Ciblas", "Daugavpils", "Dobele", "Dundaga", "Durbes", "Engure", "Ergli", "Garkalne", "Grobinas", "Gulbene", "Iecava", "Ikskile", "Ilukste", "Incukalns", "Jaunjelgava", "Jaunpiebalga", "Jaunpils", "Jekabpils", "Jelgava", "Jurmala", "Kandava", "Karsava", "Kegums", "Kekava", "Koceni", "Koknese", "Kraslava", "Krimulda", "Krustpils", "Kuldiga", "Kumene", "Lielvarde", "Ligatne", "Limbazi", "Livani", "Lizums", "Ludza", "Madona", "Mazsalaca", "Naukseni", "Nereta", "Nica", "Ogre", "Olaine", "Ozolnieki", "Pargauja", "Pasvalys", "Pelcku", "Plavinas", "Preili", "Priekuli", " Priekule", "Rauna", "Rezekne", "Riebi", "Riga", "Rujiena", "Sabile", "Salacgriva", "Salaspils", "Saldus", "Saulkrasti", "Seda", "Sigulda", "Skriveri", "Skrunda", "Smiltene", "Stopini", "Strenci", "Talsi", "Tukums", "Valka", "Valmiera", "Vandzene", "Vecpiebalga", "Vecumnieki", "Ventspils", "Viesite", "Vilaka", "Vilani", "Zilupe") # Create a Shiny UI ui <- fluidPage( titlePanel("Weather App"), selectInput("municipality", "Select municipality", municipalities), mainPanel( tabsetPanel( tabPanel("Current Weather", tableOutput("current_weather")), tabPanel("Temperature Forecast", plotlyOutput("forecast_plot")) ) ) ) # Define the function to get current weather data get_weather_data <- function(municipality) { api_key <- "c85d8912939742411f4756c70790238e" # your valid API key url <- paste0("http://api.openweathermap.org/data/2.5/weather?q=",municipality,",lv&appid=",api_key,"&units=metric") data <- httr::GET(url) data <- httr::content(data) return(data) } # Define the function to get forecast weather data get_forecast_data <- function(municipality) { api_key <- "44a8b47e94fd6388904950fd39d5b07d" # your valid API key url <- paste0("http://api.openweathermap.org/data/2.5/forecast?q=",municipality,",lv&appid=",api_key,"&units=metric") data <- httr::GET(url) data <- httr::content(data) return(data) } server <- function(input, output) { weather_data <- reactive({ if (!is.null(input$municipality)) { get_weather_data(input$municipality) } }) forecast_data <- reactive({ if (!is.null(input$municipality)) { get_forecast_data(input$municipality) } }) #render current weather information output$current_weather <- renderTable({ weather_data() }) output$forecast_plot <- renderPlotly({ #Retrieve forecast data forecast_data <- get_forecast_data(input$municipality) # extract temperature and date-time data forecast_temp <- forecast_data$list$main$temp forecast_time <- as.POSIXct(forecast_data$list$dt, origin="1970-01-01", tz="UTC") #create plot plot_ly(x = forecast_time, y = forecast_temp, type = 'scatter', mode = 'lines+markers') %>% layout(title = 'Temperature Forecast') }) } ui <- fluidPage( titlePanel("Weather App"), selectInput("municipality", "Select municipality", municipalities), mainPanel( tabsetPanel( tabPanel("Current Weather", tableOutput("current_weather")), tabPanel("Forecast Weather", plotlyOutput("forecast_plot")) ) ) ) #server server <- function(input, output) { output$current_weather <- renderTable({ get_weather_data(input$municipality) }) output$forecast_plot <- renderPlotly({ #Retrieve forecast data forecast_data <- get_forecast_data(input$municipality) # extract temperature and date-time data forecast_temp <- forecast_data$list$main$temp forecast_time <- as.POSIXct(forecast_data$list$dt, origin="1970-01-01", tz="UTC") #create plot plot_ly(x = forecast_time, y = forecast_temp, type = 'scatter', mode = 'lines+markers') %>% layout(title = 'Temperature Forecast') }) } shinyApp(ui = ui, server = server)
Скрипт начинается с загрузки нескольких библиотек: shining, jsonlite, httr и plotly. Эти библиотеки используются для создания приложения Shiny, работы с данными JSON, выполнения HTTP-запросов и создания интерактивных графиков соответственно.
Далее скрипт определяет вектор самоуправлений в Латвии. Этот вектор используется для заполнения параметров в раскрывающемся меню в пользовательском интерфейсе приложения.
Затем сценарий определяет пользовательский интерфейс (UI) для приложения с помощью функции Shiny fluidPage()
. Пользовательский интерфейс включает панель заголовка, раскрывающееся меню для выбора муниципалитета и главную панель с двумя вкладками: одна для отображения текущей погоды, а другая для отображения прогноза температуры.
Затем сценарий определяет две функции для получения текущих данных прогноза погоды и температуры для данного муниципалитета. Эти функции используют библиотеку httr
для выполнения HTTP-запросов к API OpenWeatherMap и возврата данных в виде объекта JSON.
Наконец, сценарий определяет серверную функцию, которая управляет поведением приложения. Внутри серверной функции скрипт использует функцию reactive()
для создания реактивных объектов для текущих данных прогноза погоды и температуры. Эти реактивные объекты затем используются для обновления вывода в пользовательском интерфейсе, когда пользователь выбирает муниципалитет из раскрывающегося меню. В частности, функция tableOutput()
используется для отображения текущих данных о погоде в табличном формате, а функция plotlyOutput()
используется для создания интерактивного графика данных прогноза температуры.