Intro to Shiny
Outline
Git Collaboration Review
Reading R Scripts into R
Building Applications
Intro to Shiny
{git collaboration review}
Centralized Workflow
Only one remote repsository
Don't fork! (only clone)
Remote (GitHub) is truth
One (of many) workflow structures
Remote
Person 1
Person 2
clone
clone
commit
commit
push
commit
push
Remote
Person 1
Person 2
clone
clone
commit
commit
push
commit
push
pull --rebase
Rebasing: step by step
Pull in remote changes
Manually resolve conflict in the file
Run git add to add changes to the rebase
Continue with the rebase (no need to commit)
# Put your changes on top of the remote changes
git pull --rebase
<<<<<<< HEAD # delete this non-sense!
# Keep relevant comments and code
x <- 7
# Add any/all edited files
git add .
# Continue through rebase, then push changes to GitHub
git rebase --continue
git push origin master
I suggest..
# When you sit down to do work, pull down changes. --rebase shouldn't matter here
git pull --rebase origin master
# Do some work. Some great work!
# Add and commit your work. Make sure messages are clear, and close issues.
git add .
git commit -m "Specific message that can close issues"
# Push your changes up to GitHub (the origin)
git push origin master
### If you get an error (b/c someone else has pushed), pull in changes w/ a rebase:
git pull --rebase origin master
# Open up files and edit them, removing >>>>, =====
# Add changes to the rebase
git add .
# Continue the rebase, no need to commit!
git rebase --continue
# After the rebase, push your changes to GitHub
git push origin master
Resolving merge conflicts
Merging branches
# Make and checkout new branch
git checkout -b super-hungry
# Make some changes to your file, then add and commit
git add .
git commit -m "Added super-hungry fav. food"
# Switch back to master branch
git checkout master
# Make some changes, then add and commit
git add .
git commit -m "Made changes to master"
# Merge in changes from super-hungry branch
git merge super-hungry
# Resolve the conflict MANUALLY in the file, then add and commit
git add .
git commit -m "Merged in super-hungry branch"
{reading files into R}
Reading in Scripts
Keep code organized
Facilitate easier collaboration
Makes code more modular
Will need to do this to build applications
The `source` function
Read R Code from a File or a Connection:
"source causes R to accept its input from the named file or URL or connection. Input is read and parsed from that file until the end of the file is reached, then the parsed expressions are evaluated sequentially in the chosen environment."
# Read in and evaluate code in another R script
source('file-name.R')
The `source` function
# Function to build a map
build_map <- function(data) {
# Make a map and return it
my_map <- plot_ly(data, ....)
return(my_map)
}
# Read in map function from build_map.R
source('scripts/build_map.R')
# Read in data from some source
my_data <- read.csv('data/data.csv')
# Make map
build_map(my_data)
build_map.R
index.Rmd
{building applications}
Building Applications
Systems with multiple connected components
Often span different programming languages/environments
React to user input
Super fun to build
What we've been doing
create an HTML file
publish on the web
But what if....
create an HTML file
publish on the web
The website changed analysis in R
That's the plan....
Shiny (local)
Browser passes information back to R
A local server that passes information between your RStudio session and a browser
Shiny server builds a web page based on R output
shinyapps.io
Browser passes information back to R
A free cloud-based server that passes information between an RStudio session and a browser
Shiny server builds a web page based on R output
all of this happens on a server somewhere else
Shiny Structure
ui.R: a script that controls the user-interface layout
server.R: the instructions for R required to build the app
Need both files saved in the same directory to run app
ui.R
library(shiny)
# Define UI for an application that has a title
shinyUI(
# Specify a fluidPage layout (most common)
fluidPage(
# Create a title in your fluidPage
titlePanel("Hello Shiny!")
)
)
server.R
library(shiny)
# Code to be executed by the shiny server
shinyServer(function(input, output) {
# input: information passed from the UI into the R session
# output: objects passed from R session back to the server
# Leaving this blank for now
})
Run shiny-example application
Building a histogram
# In your R session
x <- rnorm(100)
hist(x)
Building a histogram: server.R
# server.R
library(shiny)
shinyServer(function(input, output) {
# Create a histogram property of the output
output$histogram <- renderPlot({
# Use shiny's renderPlot function to render a plot
x <- rnorm(100)
return(hist(x))
})
})
Building a histogram: ui.R
library(shiny)
# Define UI for application that draws a histogram
shinyUI(
# Create a fluid page layout
fluidPage(
# Application title
titlePanel("Hello Shiny!"),
# Create a mainPanel of the app
mainPanel(
# Plot the output with the name "histogram"
plotOutput('histogram')
)
)
)
{checkout simple-hist branch}
Building a reactive histogram: ui.R
library(shiny)
# Define UI for application that draws a histogram
shinyUI(
fluidPage(
# Application title
titlePanel("Hello Shiny!"),
# Create a mainPanel of the app
mainPanel(
# Add a numbericInput to choose the number of observations
numericInput("num", label = "# observations", value = 100),
# Plot the output with the name "histogram"
plotOutput('histogram')
)
)
)
Building a reactive histogram: server.R
library(shiny)
shinyServer(function(input, output) {
# Create a histogram property of the output
output$histogram <- renderPlot({
# Use shiny's renderPlot function to render a plot
# Get the number of observations from the UI
x <- rnorm(input$num)
return(hist(x))
})
})
{checkout interactive-hist branch}
{exercise-2}
Assignments
Assignment-7: Collaborative coding (due Wed. 2/24). Turned in by 1 person, worth 50 points
Final Project: Proposal(due Wed. 2/24). Turned in by 1 person, worth 50 points
shiny-intro
By Michael Freeman
shiny-intro
- 1,542