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:
You will be creating a shiny app, so there is no need for a notebook this week.
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")
ui
and server
ui
) defines the structure of the pageui <- fluidPage(
titlePanel("Random numbers: normal distribution"), # Title panel
# Inputs
sidebarLayout(
sidebarPanel(
textInput("one", "Mean", value=0),
textInput("two", "Standard deviation", value=1),
textInput("three", "Number of repeats", value=10000),
textInput("caption", "X-axis label"),
actionButton("add", "Run"),
checkboxInput(inputId = "obs", label = strong("Show individual observations"), value = FALSE),
sliderInput("bins", "Number of bins:", min = 1, max = 100, value = 5)
),
# Result display
mainPanel(
textOutput("check"),
plotOutput("distPlot"),
tableOutput("table")
)
)
)
server
), where all the action happensoutput
that contains all of the code needed to update the R objects in your appoutput$check
in server
matches textOutput("check")
in ui
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 )
})
})
}
shinyApp(ui = ui, server = server)
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 function | Creates |
---|---|
dataTableOutput | DataTable |
htmlOutput | raw HTML |
imageOutput | image |
plotOutput | plot |
ableOutput | table |
textOutput | text |
uiOutput | raw HTML |
verbatimTextOutput | text |
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 |
[Solutions next week]
https://shiny.posit.co/r/getstarted/shiny-basics/lesson1/index.html
Back to the homepage