Building Interactive, R-Powered Web Applications with Shiny
description
Transcript of Building Interactive, R-Powered Web Applications with Shiny
![Page 1: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/1.jpg)
BUILDING INTERACTIVE,
R-POWERED WEB APPLICATIONS WITH
SHINYJeff Allen, Dallas R Users Group 2/9/2013
![Page 2: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/2.jpg)
About Me
By day… Computational
Biologist at UT Southwestern
Use R to analyze biomedical data
Develop Java-based web application
By night… Freelance
consultant as Trestle Technology Web development Data analysis IT consulting
MS Computer Science, SMU
![Page 3: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/3.jpg)
Overview Motivation Shiny Reactive Programming Code Walkthroughs
Simple histogram Advanced histogram Reactive histogram Custom outputs
Hosting
![Page 4: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/4.jpg)
Motivation
“R is great!”
“The Internet is great!”
![Page 5: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/5.jpg)
Motivation Want to get R into web browsers Previous approaches
rApache Rserve (Java, C++, C#, Python, Ruby, .NET) deployR Custom hacks
Just make R accessible to server-side programming languages (PHP, Ruby, Java, etc.)
![Page 6: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/6.jpg)
Shiny Open-Sourced by RStudio 11/2012 on
CRAN New model for web-accessible R code Able to generate basic web UIs Uses web sockets
“The new HTTP” Built on a “Reactive Programming”
model Entirely extensible
Custom inputs and outputs
![Page 7: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/7.jpg)
Reactive Programming
a <- 3
b <- a + 2
a <- 7
b == ?
Imperative: b = 5Reactive: b = 9
![Page 8: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/8.jpg)
Reactive Programming Example
![Page 9: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/9.jpg)
Basic Shiny UI and Serverhttp://trestletechnology.net:3838/simpleGeyeser/https://github.com/trestletech/shiny-sandbox/tree/master/simpleGeyeser
Basic Shiny Example
![Page 10: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/10.jpg)
ui.RshinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bins in histogram (approximate):", choices = c(10, 20, 35, 50), selected = 20), plotOutput(outputId = "main_plot", height = "300px")))
![Page 11: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/11.jpg)
ui.RshinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bins in histogram (approximate):", choices = c(10, 20, 35, 50), selected = 20), plotOutput(outputId = "main_plot", height = "300px")))
![Page 12: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/12.jpg)
ui.RshinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bins in histogram (approximate):", choices = c(10, 20, 35, 50), selected = 20), plotOutput(outputId = "main_plot", height = "300px")))
![Page 13: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/13.jpg)
ui.RshinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bins in histogram (approximate):", choices = c(10, 20, 35, 50), selected = 20), plotOutput(outputId = "main_plot", height = "300px")))
![Page 14: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/14.jpg)
ui.RshinyUI(bootstrapPage( selectInput(inputId = "n_breaks", label = "Number of bins in histogram (approximate):", choices = c(10, 20, 35, 50), selected = 20), plotOutput(outputId = "main_plot", height = "300px")))
![Page 15: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/15.jpg)
server.RshinyServer(function(input, output) { output$main_plot <- reactivePlot( function(){ hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), xlab = "Duration (minutes)", main = "Geyser eruption duration") })})
![Page 16: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/16.jpg)
server.RshinyServer(function(input, output) { output$main_plot <- reactivePlot( function(){ hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), xlab = "Duration (minutes)", main = "Geyser eruption duration") })})
![Page 17: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/17.jpg)
server.RshinyServer(function(input, output) { output$main_plot <- reactivePlot( function(){ hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), xlab = "Duration (minutes)", main = "Geyser eruption duration") })})
![Page 18: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/18.jpg)
server.RshinyServer(function(input, output) { output$main_plot <- reactivePlot( function(){ hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), xlab = "Duration (minutes)", main = "Geyser eruption duration") })})
![Page 19: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/19.jpg)
server.RshinyServer(function(input, output) { output$main_plot <- reactivePlot( function(){ hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks), xlab = "Duration (minutes)", main = "Geyser eruption duration") })})
![Page 20: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/20.jpg)
Key
Dependency Graph – SimpleshinySer
ver
$n_breaks
Reactive Function
Input
main_plot
![Page 21: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/21.jpg)
Additional UI Featureshttp://trestletechnology.net:3838/naiveGeyeser/ https://github.com/trestletech/shiny-sandbox/tree/master/naiveGeyeser/
Intermediate Shiny Example
![Page 22: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/22.jpg)
Key
Dependency Graph – NaïveshinySer
ver
$dataset
$individual_obs
$bw_adjust
$n_breaks
Reactive Function
Input
$density
main_plot(Get data, get name, plot)
![Page 23: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/23.jpg)
Key
“Data Flow”– NaïveshinySer
ver
$dataset
$individual_obs
$bw_adjust
$n_breaks
Reactive Function
Input
$density
main_plot(Get data, get name, plot)
![Page 24: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/24.jpg)
Optimized Reactive Serverhttp://trestletechnology.net:3838/reactiveGeyeser/ https://github.com/trestletech/shiny-sandbox/tree/master/reactiveGeyeser/
Reactive Shiny Example
![Page 25: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/25.jpg)
Key
Dependency Graph – Reactive
getDatadataNam
e
shinyServer
$dataset
$individual_obs
$bw_adjust
$n_breaks
Reactive Function
Input$density
main_plot
![Page 26: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/26.jpg)
Key
“Data Flow” – Reactive
getDatadataNam
e
shinyServer
$dataset
$individual_obs
$bw_adjust
$n_breaks
Reactive Function
Input$density
main_plot
![Page 27: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/27.jpg)
http://trestletechnology.net:3838/grn/https://github.com/trestletech/shiny-sandbox/tree/master/grn
D3.JS Shiny Example
![Page 28: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/28.jpg)
http://trestletechnology.net:3838/rgl/https://github.com/trestletech/shiny-sandbox/tree/master/rgl
RGL Shiny Example
![Page 29: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/29.jpg)
Hosting RStudio offers “Glimmer”
Free (for now) managed hosting platform for Shiny
RStudio‘s Shiny-Server Open sourced 1/22/2013 Written in Node.js Same software that powers Glimmer “Some assembly required” Hacks to support older IEs
Amazon Machine Image on EC2
![Page 30: Building Interactive, R-Powered Web Applications with Shiny](https://reader036.fdocuments.us/reader036/viewer/2022062316/568168f5550346895de00146/html5/thumbnails/30.jpg)
Questions? Code at
http://github.com/trestletech/shiny-sandbox Slides at
http://trestletechnology.net/blog/
Find me on: