---
title: "Workshop: W5 - Shiny"
output:
BiocStyle::html_document:
toc: false
vignette: >
% \VignetteIndexEntry{Workshop: W5 - Shiny}
% \VignetteEngine{knitr::rmarkdown}
---
```{r style, echo = FALSE, results = 'asis'}
BiocStyle::markdown()
options(width=100, max.print=1000)
knitr::opts_chunk$set(
eval=as.logical(Sys.getenv("KNITR_EVAL", "TRUE")),
cache=as.logical(Sys.getenv("KNITR_CACHE", "TRUE")))
```
```{r setup, echo=FALSE, messages=FALSE, warnings=FALSE}
suppressPackageStartupMessages({
library(shiny)
library(RNAseqData.HNRNPC.bam.chr14)
library(Homo.sapiens)
library(Gviz)
})
```
Author: Martin Morgan (mtmorgan@fredhutch.org)
Date: 7 September, 2015
Back to [Workshop Outline](Developer-Meeting-Workshop.html)
The material in this document requires _R_ version 3.2 and
_Bioconductor_ version 3.1
```{r configure-test}
stopifnot(
getRversion() >= '3.2' && getRversion() < '3.3',
BiocInstaller::biocVersion() >= "3.1"
)
```
# Interactive visualization -- `shiny`
Writing a [shiny](http://shiny.rstudio.com) app
- 'User interface' describing what the user sees
- 'Server' implementing the logic that transforms user selections to
outputs
- Very interesting 'reactive' programming model; sort of like an Excel
spread sheet, where changing a cell causes a formula in another cell
to update.
A simple directory with user interface (`ui.R`) and server
(`server.R`) _R_ scripts
- User interface, file `ui.R`
```{r shiny-ui, eval=FALSE}
library(shiny)
library(RNAseqData.HNRNPC.bam.chr14)
library(Homo.sapiens)
## Get all SYMBOLs on chr14
symbols <- keys(Homo.sapiens, keytype="SYMBOL")
map <- select(Homo.sapiens, symbols, "TXCHROM", "SYMBOL")
symchoices <- sort(unique(map$SYMBOL[map$TXCHROM %in% "chr14"]))
## Possible BAM files
bamchoices <- basename(RNAseqData.HNRNPC.bam.chr14_BAMFILES)
## Define the user interface
shinyUI(fluidPage(
## Application title
titlePanel("BAMSpector: Reads Supporting Gene Models"),
sidebarLayout(
sidebarPanel(
## input gene symbol (fancy: select from available)
selectInput("symbol", "Gene Symbol", symchoices),
## input path to BAM file
selectInput("bam", "BAM File", bamchoices, multiple=TRUE)),
## Show a plot of the generated distribution
mainPanel(plotOutput("tracksPlot")))
))
```
- Server, file `server.R`
```{r shiny-server, eval=FALSE}
## load required libraries
library(shiny)
library(RNAseqData.HNRNPC.bam.chr14)
library(Homo.sapiens)
library(Gviz)
## where are the BAM files?
dirname <- unique(dirname(RNAseqData.HNRNPC.bam.chr14_BAMFILES))
## What are the ranges of each gene?
ranges <- genes(Homo.sapiens, columns="SYMBOL")
ranges$SYMBOL <- unlist(ranges$SYMBOL)
## Create a representation of each gene region
genes <- GeneRegionTrack(TxDb.Hsapiens.UCSC.hg19.knownGene,
chromosome="chr14")
shinyServer(function(input, output) {
output$tracksPlot <- renderPlot({
if (length(input$bam) > 0) {
## coverage on each BAM file
bam <- file.path(dirname, input$bam)
coverage <- Map(DataTrack,
range = bam, name = bam,
MoreArgs=list(type = 'histogram',
window = -1, genome = 'hg19',
chromosome = 'chr14'))
} else {
coverage <- list()
}
## Select the correct range
range <- ranges[match(input$symbol, ranges$SYMBOL)]
## plot the GeneRegionTrack and coverage
plotTracks(c(list(genes), coverage),
from = start(range), to=end(range),
chr='chr14', windowSize = 30)
})
})
```
- Application
```{r shiny-launch, eval=FALSE}
shiny::runApp()
```