Quick Shiny Demo – Exploring NHS Winter Sit Rep Data
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Having spent a chink of the weekend and a piece of yesterday trying to pull NHS Winter sitrep data into some sort of shape in Scraperwiki, (described, in part, here: When Machine Readable Data Still Causes “Issues” – Wrangling Dates…), I couldn’t but help myself last night and had a quick go at using RStudio’s Shiny tooling to put together a quick, minimal explorer for it:
For proof of concept, I just pulled in data relating to the Isle of Wight NHS Trust, but it should be possible to build a more generic explorer: Isle of Wight NHS Sit Rep Explorer Demo.
Three files are used to crate the app – a script to define the user interface (ui.R), a script to define the server that responds to UI actions and displays the charts (server.R), and a supporting file that creates variables and functions that are globally available to bother the server and UI scripts (global.R).
##wightsitrep/global.R
#Loading in CSV directly from https seems to cause problems but this workaround seems okay
floader=function(fn){
temporaryFile <- tempfile()
download.file(fn,destfile=temporaryFile, method="curl")
read.csv(temporaryFile)
}
#This is the data source - a scraperwiki API call
#It would make sense to abstract this further, eg allowing the creation of the URL based around a passed in a select statement
u="https://api.scraperwiki.com/api/1.0/datastore/sqlite?format=csv&name=nhs_sit_reps&query=select%20SHA%2CName%2C%20fromDateStr%2CtoDateStr%2C%20tableName%2CfacetB%2Cvalue%20from%20fulltable%20%20where%20Name%20like%20'%25WIGH%25'"
#Load the data and do a bit typecasting, just in case...
d=floader(u)
d$fdate=as.Date(d$fromDateStr)
d$tdate=as.Date(d$toDateStr)
d$val=as.integer(d$value)
##wightsitrep/ui.R
library(shiny)
tList=levels(d$tableName)
names(tList) = tList
# Define UI for application that plots random distributions
shinyUI(pageWithSidebar(
# Application title
headerPanel("IW NHS Trust Sit Rep Explorer"),
sidebarPanel(
#Just a single selector here - which table do you want to view?
selectInput("tbl", "Report:",tList),
div("This demo provides a crude graphical view over data extracted from",
a(href='http://transparency.dh.gov.uk/2012/10/26/winter-pressures-daily-situation-reports-2012-13/',
"NHS Winter pressures daily situation reports"),
"relating to the Isle of Wight NHS Trust."),
div("The data is pulled in from a scraped version of the data stored on Scraperwiki",
a(href="https://scraperwiki.com/scrapers/nhs_sit_reps/","NHS Sit Reps"),".")
),
#The main panel is where the "results" charts are plotted
mainPanel(
plotOutput("testPlot"),
tableOutput("view")
)
))
##wightsitrep/server.R
library(shiny)
library(ggplot2)
# Define server logic
shinyServer(function(input, output) {
#Do a simple barchart of data in the selected table.
#Where there are "subtables", display these using the faceted view
output$testPlot = reactivePlot(function() {
g=ggplot(subset(d,fdate>as.Date('2012-11-01') & tableName==input$tbl))
g=g+geom_bar(aes(x=fdate,y=val),stat='identity')+facet_wrap(~tableName+facetB)
g=g+theme(axis.text.x=element_text(angle=-90),legend.position="none")+labs(title="Isle of Wight NHS Trust")
#g=g+scale_y_discrete(breaks=0:10)
print(g)
})
#It would probable make sense to reshape the data presented in this table
#For example, define columns based on facetB values, so we have one row per date range
#I also need to sort the table by date
output$view = reactiveTable(function() {
head(subset(d,tableName==input$tbl,select=c('Name','fromDateStr','toDateStr','tableName','facetB','value')),n=100)
})
})
I get the feeling that it shouldn’t be too hard to create quite complex Shiny apps relatively quickly, pulling on things like Scraperwiki as a remote data source. One thing I haven’t tried is to use googleVis components, which would support in the first instance at least a sortable table view… Hmmm…
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
