Shiny

5 minute read

Published:

This lesson is from datacamp Introduction to Shiny

# Template
library(shiny)
ui - fluidPage(
)
server = function(input, output, session){
}
shinyApp(ui = ui, server = server)
library(shiny)
ui = fluidPage(
  "Hello World!"
) 
server = function(input, output, session){
}
shinyApp(ui=ui, server=server)
library(shiny)

ui = fluidPage(
  textInput("name", "Enter a name: ")
) 
server = function(input,
                  output,
                  session){
  
  
}
options(shiny.host = '0.0.0.0')
options(shiny.port = 8000)
shinyApp(ui=ui, server=server)
library(shiny)

# Displays input and output
# Output is from server based on input
ui = fluidPage(
  textInput("name", "Enter a name: "),
  textOutput("text")
) 

# server will paste name from input and additional content
# in the output text
server = function(input, output, session){
  output$text = renderText({
      paste("Do you prefer R or Tableau,", input$name, "?")
    }) 
}
shinyApp(ui=ui, server=server)
# Greeting App

library(shiny)
library(dplyr)
library(ggplot2)
library("babynames")


ui = fluidPage(
  textInput("name", "What is your name?"),
  textOutput("greeting")
)

server = function(input, output){
  output$greeting = renderText({
    paste("Hello ", input$name)
  })
}

options(shiny.host = "0.0.0.0")
options(shiny.port = 8000)

shinyApp(ui=ui, server=server)
library(shiny)
library(dplyr)
library(ggplot2)
library("babynames")

ui = fluidPage(
  #titlePanel("Baby Name Explorer"),
  textInput("name", "Enter Name ", "Name"),
  plotOutput("trend")
)

server = function(input, output){
  output$trend = renderPlot({
    babynames %>%
      filter(name == input$name) %>%
      ggplot(aes(x=year, y=prop)) +
      geom_line()
  })
}

shinyApp(ui, server)
# Babynames Explorer
library("babynames") # install.packages("babynames")
library(shiny)
library(dplyr)
library(ggplot2)
library("babynames")

ui = fluidPage(
  titlePanel("Baby Name Explorer"),
  sidebarLayout(
    sidebarPanel(
      textInput("name", "Enter Name ", "Name")
    ),
    mainPanel(plotOutput("trend"))
  )
)

server = function(input, output){
  output$trend = renderPlot({
    babynames %>%
      filter(name == input$name) %>%
      ggplot(aes(x=year, y=prop)) +
      geom_line()
  })
}

shinyApp(ui, server)

Select Input

library(shiny)
library(dplyr)
library(ggplot2)
library("babynames")

ui = fluidPage(
  titlePanel("Baby Name Explorer"),
  sidebarLayout(
    sidebarPanel(
      selectInput("name", 
                  "Enter name", 
                  choices = c("David", "Emma", "Mary"))
      
    ),
    mainPanel(plotOutput("trend"))
  )
)

server = function(input, output){
  output$trend = renderPlot({
    babynames %>%
      filter(name == input$name) %>%
      ggplot(aes(x=year, y=prop)) +
      geom_line()
  })
}

shinyApp(ui, server)

Slider Input

ui = fluidPage(
  titlePanel("Baby Name Explorer"),
  sidebarLayout(
    sidebarPanel(
      selectInput("name", 
                  "Enter name", 
                  choices = c("David", "Emma", "Mary")),
      sliderInput("year", "Select Year",
                  value = 1920,
                  min = 1900,
                  max = 2005)
      
    ),
    mainPanel(plotOutput("trend"))
  )
)

server = function(input, output){
  output$trend = renderPlot({
    babynames %>%
      filter(name == input$name) %>%
      filter(year > input$year) %>%
      ggplot(aes(x=year, y=prop)) +
      geom_line()
  })
}

shinyApp(ui, server)
library(shiny)

ui = fluidPage(
  textInput("name", "Enter a name:"),
  selectInput("animal",
              "Dogs or cats?",
              choices = c("dogs", "cats")),
  textOutput("greeting"),
  textOutput("answer")
)

server = function(input, output, session){
  output$greeting = renderText({
    paste("Do you prefer dogs or cats,", input$name, "?")
  })
  output$answer = renderText({
    paste("I prefer ", input$animal, "!")
  })
}

shinyApp(ui=ui, server=server)
library(shiny)
library(dplyr)
library(ggplot2)
library("babynames")

ui = fluidPage(
  titlePanel("What's in a name"),
  selectInput("gender", 
              "Select Gender",
              choices = c("F", "M")),
  sliderInput("year",
              "Select a year",
              value = 1900,
              min = 1900,
              max = 2010),
  plotOutput("plot_top_10_names")
  
)

server = function(input, output){
  output$plot_top_10_names = renderPlot({
    babynames %>%
      filter(sex == input$gender) %>%
      filter(year == input$year) %>%
      top_n(10, prop) %>%
      ggplot(aes(x=name, y=prop)) +
      geom_col(fill="blue")
  })
}

shinyApp(ui=ui, server=server)
  • tableOutput() and renderTable()
  • imageOutput() and renderImage()
  • plotOutput() and renderPlot()

Table Output

# renderTable() and tableOutput() or dataTableOutput
# renderImage() and imageOutput()
# renderPlot() and plotOutput()


library(shiny)
library(ggplot2)
library(dplyr)
library("babynames")

ui = fluidPage(
  titlePanel("What's in a Name?"),
  selectInput('gender', 
              'Select Gender', 
              choices = c("F", "M")),
  sliderInput('year', 
              'Select Year', 
              min = 1900, 
              max = 2010, 
              value = 1900),
  tableOutput("table_top_10_names")
  
)
server = function(input, output, session){
  output$table_top_10_names = renderTable({
    top_10_names <- babynames %>% 
      filter(sex == input$gender) %>% 
      filter(year == input$year) %>% 
      top_n(10, prop)
  })
}
shinyApp(ui = ui, server = server)

DT

# Using DT
library(shiny)
library(DT) # install.packages("DT")
library(ggplot2)
library(dplyr)
library("babynames")

ui = fluidPage(
  titlePanel("What's in a name"),
  selectInput("gender", 
              "Select Gender",
              choices = c("F", "M")),
  sliderInput("year",
              "Select a year",
              value = 1900,
              min = 1900,
              max = 2010),
  DT::DTOutput("table_top_10_names")
  
)

server = function(input, output){
  output$table_top_10_names = DT::renderDT({
    babynames %>%
      filter(sex == input$gender) %>%
      filter(year == input$year) %>%
      top_n(100, prop) 
  })
}

shinyApp(ui=ui, server=server)

# Using function inside a server
ui = fluidPage(
  titlePanel("What's in a name"),
  selectInput("gender", 
              "Select Gender",
              choices = c("F", "M")),
  sliderInput("year",
              "Select a year",
              value = 1900,
              min = 1900,
              max = 2010),
  DT::DTOutput("table_top_10_names")
  
)

server = function(input, output){
  temp = function(){
    babynames %>%
      filter(sex == input$gender) %>%
      filter(year == input$year) %>%
      top_n(100, prop) 
  }
  
  output$table_top_10_names = DT::renderDT({
    temp()
  })
}

shinyApp(ui=ui, server=server)

Using function inside server

# Using function inside server
library(shiny)
library(ggplot2)
library(dplyr)
library("babynames")

ui <- fluidPage(
  titlePanel("What's in a Name?"),
  selectInput('gender', 
              'Select gender', 
              choices = c("M", "F")),
  sliderInput('year', 
              'Select Year', 
              min = 1900, 
              max = 2010, 
              value = 1900),
  DT::DTOutput('table_top_10_names')
)

server <- function(input, output, session){
  temp = function(){
    babynames %>% 
      filter(sex == input$gender) %>% 
      filter(year == input$year) %>% 
      top_n(10, prop)
  }
  output$table_top_10_names <- DT::renderDT({
    temp()
  })
}
shinyApp(ui = ui, server = server)

Using DT a fraction of table

# Using DT a fraction of table

library(shiny)
library(DT) 
library(ggplot2)
library(dplyr)
library("babynames")

ui = fluidPage(
  DT::DTOutput("babynames_table")
)

server = function(input, output){
  output$babynames_table = DT::renderDT({
    babynames %>%
      dplyr::sample_frac(0.1)
  })
}

shinyApp(ui = ui, server = server)

Interactive Plot Output

# Interactive Plot Output

library(shiny)
library(ggplot2)
library(dplyr)
library("babynames")

top_trendy_names = babynames %>%
  filter(year==2017) %>%
  group_by(name) %>%
  summarise(total = sum(prop)) %>%
  arrange(desc(total)) %>%
  top_n(10, total)

ui <- fluidPage(
  selectInput('name', 'Select Name', top_trendy_names$name),
  # CODE BELOW: Add a plotly output named 'plot_trendy_names'
  plotly::plotlyOutput('plot_trendy_names')
)
server <- function(input, output, session){
  # Function to plot trends in a name
  plot_trends <- function(){
    babynames %>% 
      filter(name == input$name) %>% 
      ggplot(aes(x = year, y = n)) +
      geom_col()
  }
  # CODE BELOW: Render a plotly output named 'plot_trendy_names'
  output$plot_trendy_names <- plotly::renderPlotly({
    plot_trends()
  })
}
shinyApp(ui = ui, server = server)