Install the following packages shiny, packrat, rsconnect.
library(shiny)
library(packrat)
library(rsconnect)
In this question, you will build and publish your first shiny app. Following these steps to do so
Create a new R Script (File -> New R Script).
Copy these code to the file
Save the file as app.R file into a newly created folder.
Press Ctrl + Shift + Enter to run the app locally.
Create an account
Go to https://www.shinyapps.io/admin/#/dashboard. Copy the secret code.
It should look like this
rsconnect::setAccountInfo(name='fall20',
token='E130D64F22776383660DA7EA5251EC04',
secret='mJI7rgq2Wf46g2Wf46g2WNOa+E6NRqr26yG3N5')
Go back to the app (If you closed it, hit Ctrl + Shift + Enter to reopen it), click to Publish on the top right corner.
Paste the secret code and follow the instruction to publish the app on the Internet.
# Set User Interface
ui <- fluidPage(
titlePanel("Hello Shiny!"),
sidebarLayout(
sidebarPanel(
sliderInput(
inputId = "var1",
label = "Decide a number",
min = 1,
max = 100,
value=10
)
),
mainPanel(
# Output: Histogram ----
plotOutput(outputId = 'blah1')
)
)
)
######################################
# Main codes for the app
server <- function(input, output) {
output$blah1 <-renderPlot({
m = input$var1
hist(rnorm(mean=m, n=1000))
}
)
}
######################################
# Run the app
shinyApp(ui = ui, server = server)
Write a shiny app that can plot barplot of two categorical variables in the titanic dataset.
Notice: Two different shiny apps should be in two different folders.
library(tidyverse)
library(shiny)
d = read_csv('titanic.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Barplots"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Categorical Variable",
choices = variables_names, selected = "Pclass"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names,
selected = "Sex"
)
),
# Main panel for displaying outputs ----
mainPanel(
# Output: Histogram ----
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
d = read_csv('titanic.csv')
v1 = input$var1
v2 = input$var2
library(ggplot2)
r = ggplot(d, aes(x = as.factor(d[[v1]]), fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
return(r)
})
}
# app
shinyApp(ui = ui, server = server)
Write a shiny app that can plot barplot of two categorical variables in an uploaded dataset.
library(tidyverse)
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Barplot Visualization"),
sidebarLayout(
sidebarPanel(
fileInput('f1', label = 'Upload data for visualization', accept = '.csv'),
selectInput('v1', label='Select a Categorical Variable', choices=''),
selectInput('v2', label='Select a Categorical Variable', choices='')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server
server <- function(input, output, session) {
myData <- reactive({
inFile = input$f1
if (is.null(inFile)) return(NULL)
data <- read.csv(inFile$datapath, header = TRUE)
data
}
)
output$show_plot <- renderPlot({
inFile = input$f1
v1 = input$v1
d <- read.csv(inFile$datapath, header = TRUE)
v1 = input$v1
v2 = input$v2
library(ggplot2)
r = ggplot(d, aes(x = as.factor(d[[v1]]), fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
return(r)
})
observeEvent(input$f1,{
inFile = input$f1
data <- read.csv(inFile$datapath, header = TRUE)
updateSelectInput(session, 'v1', choices = names(data))}
)
observeEvent(input$f1,{
inFile = input$f1
data <- read.csv(inFile$datapath, header = TRUE)
updateSelectInput(session, 'v2', choices = names(data))}
)
}
shinyApp(ui = ui, server = server)
Write a shiny app that can plot the scatter plot of two numeric variables and colored by a categorical variable in an uploaded dataset. Example of the plot: https://bryantstats.github.io/math421/slides/6_viz.html#15
Notice: that you can only run 5 apps on shinyapps.io. If you are running out of apps, you may want to create another account and use multiple accounts. You may want to try publishing a few times. You could also embed all your shiny apps in an Rmarkdown. Do the follows to embed an shiny app to an rmarkdown.
library(tidyverse)
library(shiny)
library(DT)
ui <- fluidPage(
titlePanel("Visualization"),
sidebarLayout(
sidebarPanel(
fileInput('f1', label = 'Upload data for visualization', accept = '.csv'),
selectInput('v1', label='Select a Numeric Variable', choices=''),
selectInput('v2', label='Select a Numeric Variable', choices=''),
selectInput('v3', label='Select a Categorical Variable', choices='')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server
server <- function(input, output, session) {
myData <- reactive({
inFile = input$f1
if (is.null(inFile)) return(NULL)
data <- read.csv(inFile$datapath, header = TRUE)
data
}
)
output$show_plot <- renderPlot({
inFile = input$f1
v1 = input$v1
d <- read.csv(inFile$datapath, header = TRUE)
v1 = input$v1
v2 = input$v2
v3 = input$v3
library(ggplot2)
r = ggplot(d, aes(x = d[[v1]], y = d[[v2]], color = as.factor(d[[v3]])))+
geom_point()+
labs(x = v1, y = v2, color = v3)
return(r)
})
observeEvent(input$f1,{
inFile = input$f1
data <- read.csv(inFile$datapath, header = TRUE)
updateSelectInput(session, 'v1', choices = names(data))}
)
observeEvent(input$f1,{
inFile = input$f1
data <- read.csv(inFile$datapath, header = TRUE)
updateSelectInput(session, 'v2', choices = names(data))}
)
observeEvent(input$f1,{
inFile = input$f1
data <- read.csv(inFile$datapath, header = TRUE)
updateSelectInput(session, 'v3', choices = names(data))}
)
}
shinyApp(ui = ui, server = server)
Write a shiny app create a plot for the titanic dataset. The user inputs two variables and can change the range of Age (i.e., use sliderInput).
library(tidyverse)
library(shiny)
d = read_csv('titanic.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Bar Plot"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Categorical Variable",
choices = variables_names, selected = "SibSp"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names,
selected = "Sex"
),
sliderInput(inputId = "age",
"Select Age Range:",
min = min(d$Age, na.rm=TRUE),
max = max(d$Age, na.rm=TRUE),
value= c(1, 80))
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
library(ggplot2)
d <- d %>% filter(Age>input$age[1], Age<input$age[2])
ggplot(d, aes(x = d[[v1]], fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
})
}
# app
shinyApp(ui = ui, server = server)
Write a shiny app create plots for the titanic dataset. The user inputs two variables and can choose a multiple choice option (i.e., useradioButtons).
library(tidyverse)
library(shiny)
d = read_csv('titanic.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Plots for the Titanic Data"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "SibSp"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names,
selected = "Sex"
),
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Boxplot" = "boxplot",
"Density Plot" = "density",
"Bar Plot" = "barplot"),
selected = 'barplot')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
library(ggplot2)
if(input$plot_choice == 'boxplot')
{
ggplot(d, aes(x = d[[v1]], color = as.factor(d[[v2]])))+
geom_boxplot()+
labs(x = v1, color = v2)
}
else if(input$plot_choice == 'density')
{
ggplot(d, aes(x = d[[v1]], color = as.factor(d[[v2]])))+
geom_density()+
labs(x = v1, color = v2)
}
else
{
ggplot(d, aes(x = d[[v1]], fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
}
})
}
# app
shinyApp(ui = ui, server = server)
Write a shiny app create a plot for the titanic dataset. The user inputs two variables and can choose a tick on some options of a variable (i.e., usecheckboxGroupInput).
library(tidyverse)
library(shiny)
d = read_csv('titanic.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Bar Plot"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Categorical Variable",
choices = variables_names, selected = "Survived"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names,
selected = "Sex"
),
checkboxGroupInput(inputId = "Pclass", label = "Select Passenger Class",
choices = names(table(d$Pclass)), inline = TRUE,
selected = "1"),
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
d <- d %>% filter(Pclass %in% input$Pclass)
library(ggplot2)
ggplot(d, aes(x = as.factor(d[[v1]]), fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
})
}
# app
shinyApp(ui = ui, server = server)
Write a shiny app create a plot for the titanic dataset. Make uses of selectInput, sliderInput, radioButtons, and checkboxGroupInput.
library(tidyverse)
library(shiny)
d = read_csv('titanic.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Plotting the Titanic Data"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "Fare"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names, selected = "Sex"
),
sliderInput(inputId = "age",
"Select Age Range:",
min = min(d$Age, na.rm=TRUE),
max = max(d$Age, na.rm=TRUE),
value= c(1, 80)
),
checkboxGroupInput(inputId = "Pclass", label = "Select Passenger Class",
choices = names(table(d$Pclass)), inline = TRUE,
selected = "1")
,
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Boxplot" = "boxplot",
"Density Plot" = "density",
"Bar Plot" = "barplot"),
selected = 'density')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
library(ggplot2)
d <- d %>% filter(Age>input$age[1], Age<input$age[2])
d <- d %>% filter(Pclass %in% input$Pclass)
if(input$plot_choice == 'boxplot')
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_boxplot()+
labs(x = v1, color = v2)
}
else if(input$plot_choice == 'density')
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_density()+
labs(x = v1, color = v2)
}
else
{
ggplot(d, aes(x = (d[[v1]]), fill = as.factor(d[[v2]])))+
geom_bar()+
labs(x = v1, fill = v2)
}
})
}
# app
shinyApp(ui = ui, server = server)
Use the below data to write this shiny app: https://fall20.shinyapps.io/app9/. Check out the app carefully to see its features.
The data: https://covidtracking.com/data/download/all-states-history.csv
library(tidyverse)
library(shiny)
d = read_csv('https://covidtracking.com/data/download/all-states-history.csv')
variables_names = names(d)
d <- d %>%
filter(state %in% c('CA','FL','TX','MA','NY','OH'))
ui <- fluidPage(
titlePanel("Covid 19 by States"),
sidebarLayout(
sidebarPanel(
checkboxGroupInput(inputId = "state", label = "Select state to compare",
choices = c("CA","FL","TX","MA","NY","OH"), inline = TRUE,
selected = "CA")
,
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "positive"
),
sliderInput(inputId = "Date",
"Select Date Range:",
min = min(d$date, na.rm = TRUE),
max = max(d$date, na.rm = TRUE),
value = c(min(d$date),max(d$date)),
timeFormat = "%d %b"
),
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Line Plot" = "line_plot",
"Point Plot" = "point_plot"),
selected = 'line_plot')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
library(ggplot2)
d <- d %>% filter(date>input$Date[1], date<input$Date[2])
d <- d %>% filter(state %in% input$state)
if(input$plot_choice == 'line_plot')
{
ggplot(d, aes(y = (d[[v1]]), x = (d$date), color = d$state))+
geom_line()+
labs(x = "Date", y = v1, color = d$state)
}
else
{
ggplot(d, aes(y = (d[[v1]]), x = (d$date), color = d$state))+
geom_point()+
labs(x = "Date", y = v1, color = d$state)
}
})
}
# app
shinyApp(ui = ui, server = server)
Make uses of selectInput, sliderInput, radioButtons, and checkboxGroupInput to write the second app on the data used on question 9.
The data: https://covidtracking.com/data/download/all-states-history.csv
library(tidyverse)
library(shiny)
d = read_csv('https://covidtracking.com/data/download/all-states-history.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Covid 19"),
sidebarLayout(
sidebarPanel(
checkboxGroupInput(inputId = "dataquality", label = "Select Data Quality Grade",
choices = c("A+","A","B","C","D","F"), inline = TRUE,
selected = c("A+","A"))
,
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "recovered"
),
selectInput(
inputId ="var2",
label = "Select a State",
choices = names(table(d$state)), selected = "MA"
),
sliderInput(inputId = "Date",
"Select Date Range:",
min = min(d$date, na.rm = TRUE),
max = max(d$date, na.rm = TRUE),
value = c(min(d$date),max(d$date)),
timeFormat = "%d %b"
),
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Line Plot" = "line_plot",
"Point Plot" = "point_plot",
"Bar Plot" = "bar_plot"),
selected = 'line_plot')
),
# Main panel for displaying outputs ----
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
library(ggplot2)
d <- d %>% filter(date>input$Date[1], date<input$Date[2])
d <- d %>% filter(dataQualityGrade %in% input$dataquality)
d <- d %>% filter(state %in% input$var2)
if(input$plot_choice == 'line_plot')
{
ggplot(d, aes(y = (d[[v1]]), x = (d$date)))+
geom_line()+
labs(x = "Date", y = v1)
}
else if(input$plot_choice == 'bar_plot')
{
ggplot(d, aes(y = (d[[v1]]), x = (d$dataQualityGrade)))+
geom_col()+
labs(x = "Data Quality Grade", y = v1)
}
else
{
ggplot(d, aes(y = (d[[v1]]), x = (d$date)))+
geom_point()+
labs(x = "Date", y = v1)
}
})
}
# app
shinyApp(ui = ui, server = server)
Write a shiny app on own selected data. Make uses of selectInput, sliderInput, radioButtons, and checkboxGroupInput.
library(tidyverse)
library(shiny)
d = read_csv('insurance.csv')
variables_names = names(d)
ui <- fluidPage(
titlePanel("Plotting Health Insurance Data"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "charges"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names, selected = "sex"
),
sliderInput(inputId = "bmi",
"Select BMI Range:",
min = min(d$bmi, na.rm=TRUE),
max = max(d$bmi, na.rm=TRUE),
value= c(min(d$bmi),max(d$bmi))
),
checkboxGroupInput(inputId = "Region", label = "Select Region",
choices = names(table(d$region)), inline = TRUE,
selected = c("northeast","northwest")
),
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Boxplot" = "boxplot",
"Density Plot" = "density"),
selected = 'boxplot')
),
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
library(ggplot2)
d <- d %>% filter(bmi>input$bmi[1], bmi<input$bmi[2])
d <- d %>% filter(region %in% input$Region)
if(input$plot_choice == 'boxplot')
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_boxplot()+
labs(x = v1, color = v2)
}
else
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_density()+
labs(x = v1, color = v2)
}
})
}
# app
shinyApp(ui = ui, server = server)
Follow this below example to include navbarPage to the app in Question 11. You can also write another app that make uses of selectInput, sliderInput, radioButtons, checkboxGroupInput and navbarPage.
library(tidyverse)
library(shiny)
d = read_csv('insurance.csv')
variables_names = names(d)
ui <- navbarPage("Navigation",
tabPanel("Numeric and Categorical Plots",
titlePanel("Plotting Health Insurance Data"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var1",
label = "Select a Numeric Variable",
choices = variables_names, selected = "charges"
),
selectInput(
inputId ="var2",
label = "Select a Categorical Variable",
choices = variables_names, selected = "sex"
),
sliderInput(inputId = "bmi",
"Select BMI Range:",
min = min(d$bmi, na.rm=TRUE),
max = max(d$bmi, na.rm=TRUE),
value= c(min(d$bmi),max(d$bmi))
),
checkboxGroupInput(inputId = "Region", label = "Select Region",
choices = names(table(d$region)), inline = TRUE,
selected = c("northeast","northwest")
),
radioButtons(inputId = "plot_choice",
label = h3("Select Plot:"),
choices = c("Boxplot" = "boxplot",
"Density Plot" = "density"),
selected = 'boxplot')
),
mainPanel(
plotOutput(outputId = 'show_plot')
)
)
),
tabPanel("Bar Plots",
titlePanel("Plotting Health Insurance Data"),
sidebarLayout(
sidebarPanel(
selectInput(
inputId ="var3",
label = "Select a Categorical Variable",
choices = variables_names, selected = "children"
),
selectInput(
inputId ="var4",
label = "Select a Categorical Variable",
choices = variables_names, selected = "smoker"
),
sliderInput(inputId = "bmi1",
"Select BMI Range:",
min = min(d$bmi, na.rm=TRUE),
max = max(d$bmi, na.rm=TRUE),
value= c(min(d$bmi),max(d$bmi))
),
checkboxGroupInput(inputId = "Region1", label = "Select Region",
choices = names(table(d$region)), inline = TRUE,
selected = c("northeast","northwest"))
),
mainPanel(
plotOutput(outputId = 'show_plot2')
)
)
)
)
# server is a function!
server <- function(input, output) {
output$show_plot <- renderPlot({
v1 = input$var1
v2 = input$var2
library(ggplot2)
d <- d %>% filter(bmi>input$bmi[1], bmi<input$bmi[2])
d <- d %>% filter(region %in% input$Region)
if(input$plot_choice == 'boxplot')
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_boxplot()+
labs(x = v1, color = v2)
}
else
{
ggplot(d, aes(x = (d[[v1]]), color = as.factor(d[[v2]])))+
geom_density()+
labs(x = v1, color = v2)
}
})
output$show_plot2 <- renderPlot({
v3 = input$var3
v4 = input$var4
library(ggplot2)
d <- d %>% filter(bmi>input$bmi1[1], bmi<input$bmi1[2])
d <- d %>% filter(region %in% input$Region1)
ggplot(d, aes(x = as.factor(d[[v3]]), fill = as.factor(d[[v4]]))) +
geom_bar() + labs(x = v3, fill = v4)
})
}
# app
shinyApp(ui = ui, server = server)
Present your shiny app in Question 12 on the final exam day.