Shiny Exercise 3

Display Number of Storms by Year

Published

May 5, 2025

Goal: Display Number of Storms by Year.

  1. Add a table output element to the ui and a corresponding renderer to the server. The table should display the number of named storms in each year.

  2. Add a plot output element to the ui, and a corresponding renderer to the server. The plot should display the number of named storms in each year.

# R pakcages
library(shiny)
library(dplyr)

# data preps
data(storms)
storms_by_year <- storms |>
  group_by(year) |>
  summarize(n = n_distinct(name))

storms_by_year_wide <-storms |>
  mutate(year = as.integer(year)) |> 
  group_by(year) |>
  summarize(n = n_distinct(name)) |> 
  filter(year %% 5 == 0) |> 
  pivot_wider(names_from = year, values_from = n)

# ui
ui <- fluidPage(

  )

# server
server <- function(input, output, session) {
  
}

shinyApp(ui, server)
Click to Check the Complete Shiny App Code!
# R packages
library(shiny)
library(tidyverse)

# data preps
data(storms)
storms_by_year <- storms |>
  group_by(year) |>
  summarize(n = n_distinct(name)) 

storms_by_year_wide <-storms |>
  mutate(year = as.integer(year)) |> 
  group_by(year) |>
  summarize(n = n_distinct(name)) |> 
  filter(year %% 5 == 0) |> 
  pivot_wider(names_from = year, values_from = n)

# ui
ui <- fluidPage(
  
  # 1. byYearTable
  tableOutput("byYearTable"),
  
  # 2. byYearPlot
  plotOutput("byYearPlot")
  
  )

server <- function(input, output, session) {
  
  # 1. byYearTable
  output$byYearTable <- renderTable({
    storms_by_year_wide
  })
  
  # 2. byYearPlot
  output$byYearPlot <- renderPlot({
    ggplot(data = storms_by_year) +
      geom_line(aes(x = year, y = n)) +
      labs(x = "Year",
           y = "Number of Storms") +
      theme_minimal() +
      theme(axis.title.x = element_text(size = rel(2),
                                        margin 
                                        = margin(30,0,0,0)),
            axis.title.y = element_text(size = rel(2),
                                        margin 
                                        = margin(0,30,0,0)),
            axis.text.x = element_text(size = rel(2)),
            axis.text.y = element_text(size = rel(2)))
  })
  
}

shinyApp(ui, server)
Back to top