BINF_tut


Project maintained by sarbal Hosted on GitHub Pages — Theme by mattgraham

Week 10: So shiny!

Objectives

Let’s make something interactive! Shiny is an R package that makes it easy to build interactive web applications (apps) straight from R. This lesson will get you started building Shiny apps right away. You will learn how to:

Setting up

You will be creating a shiny app, so there is no need for a notebook this week.

What’s Shiny, precious, eh?

Start off by installing the shiny package:

install.packages("shiny")

Then load the package.

library(shiny)

RStudio makes it very easy to build an app. Simply click on the “File” dropdown menu, then “New File” and then “Shiny Web App…”. A pop up box will ask you for an “Application name”, call your app whatever you wish (e.g., my_app). Select the “Single File (app.R)” radio button. And then pick your working directory (click Browse on the final box). When you are ready, click “Create”.

This will generate a folder with your app name, and a file called “app.R”. We will be working with this file. It should have two functions: ui and server. They should be pre-filled with a histogram drawing app. You can test it out by running in the command console (make sure you are in the working directory where your app is):

runApp("my_app")

Reactive == Interactive

Two main functions: ui and server

server <- function(input,output,session) {
  # Reactive input 
  observeEvent( input$add,{
    x <- as.numeric(input$one)  # This input comes from the first number box (Mean)
    y <- as.numeric(input$two)  # This input comes from the second number box (Standard deviation)
    n <- as.numeric(input$three)  # This input comes from the third number box (Number of repeats)
    label <- as.character(input$caption) # This input comes from the text box 
    
    # Reactive expressions
    d <-  rnorm(n, x, y)
    bins <- seq(min(d), max(d), length.out = input$bins + 1)
    m <- mean(d)
    sdd <- sd(d)  
    # Reactive output
    output$check <- renderPrint("Done!")
    output$distPlot <- renderPlot({
      
      # Draw the histogram with the specified number of bins
      hist(d, breaks = bins, freq=F, col = 'darkgray', border = 'white', xlab=label)
      ld <- density(d)
      lines(ld, col=4) 
      abline(v=x, lty=2, lwd=3, col=4)      
      if (input$obs) { rug(d) }
      
    })
    output$table <- renderTable({
      data = cbind( m, sdd)
      return( data ) 
    })  
  })
}

Run!

shinyApp(ui = ui, server = server)

Widgets (input)

function widget
actionButton Action Button
checkboxGroupInput A group of check boxes
checkboxInput A single check box
dateInput A calendar to aid date selection
dateRangeInput A pair of calendars for selecting a date range
fileInput A file upload control wizard
helpText Help text that can be added to an input form
numericInput A field to enter numbers
radioButtons A set of radio buttons
selectInput A box with choices to select from
sliderInput A slider bar
submitButton A submit button
textInput A field to enter text

Output functions

Output function Creates
dataTableOutput DataTable
htmlOutput raw HTML
imageOutput image
plotOutput plot
ableOutput table
textOutput text
uiOutput raw HTML
verbatimTextOutput text

Render functions

render function Creates
renderDataTable DataTable
renderImage images (saved as a link to a source file)
renderPlot plots
renderPrint any printed output
renderTable data frame, matrix, other table like structures
renderText character strings
renderUI a Shiny tag object or HTML

Test yourself!

  1. We can modify the different bits of code in the ui and server functions to change the display and functionality of the code. Copy the above functions into this app. Run and play around! Increase the number of repeats, change the number of bins, and test different inputs.
  2. Try different functions. Currently we are using the random “normal” generator. Make one for the Poisson distribution, and two others (see which here). Make sure you change the inputs needed accordingly (ie add more input boxes, change text).

[Solutions next week]

Resources and other

https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/index.html

Back to the homepage