---
title: Shiny Web Apps
author: "Thomas Girke"
date: "Last update: `r format(Sys.time(), '%d %B, %Y')`" 
output:
  html_document:
    toc: true
    toc_float:
        collapsed: true
        smooth_scroll: true
    toc_depth: 3
    fig_caption: yes
    code_folding: show
    number_sections: true
fontsize: 14pt
bibliography: bibtex.bib
weight: 16
type: docs
editor_options: 
  chunk_output_type: console
---

<!--
- Compile from command-line
Rscript -e "rmarkdown::render('shinyapps.Rmd', c('html_document'), clean=F); knitr::knit('shinyapps.Rmd', tangle=TRUE)"
-->

```{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(ggplot2)
    library(fgsea)
})
```

<div style="text-align: right"> 
Source code downloads: &nbsp; &nbsp;
[.Rmd](https://raw.githubusercontent.com/tgirke/GEN242//main/content/en/tutorials/shinyapps/shinyapps.Rmd)  &nbsp; &nbsp; 
[.R](https://raw.githubusercontent.com/tgirke/GEN242//main/content/en/tutorials/shinyapps/shinyapps.R) 
</div>

## What is Shiny?

zz[Shiny](https://shiny.rstudio.com/gallery/) is an R-based environment for building interactive web applications for
data analysis and exploration [@noauthor_undated-mi; @shiny1]. Since most JavaScript code is autogenerated by
the environment, basic R knowledge is sufficient for developing Shiny apps. 
They can be deployed on local computers or web servers including custom and cloud-based servers (e.g.
AWS, GCP, [shinyapp.io](http://www.shinyapps.io/) service). The basic structure of a Shiny app is an
`app.R` script containing the following components:

1. User interface
    ```{r fluidpage, eval=FALSE}
    ui <- fluidPage()
    ```

2. Server function
    ```{r server, eval=FALSE}
    server <- function(input, output) {}
    ```
3. Statement to run shiny app
    ```{r shinyapp, eval=FALSE}
    shinyApp(ui = ui, server = server)
    ```

Alternatively, the `ui` and `server` functions can be organized in two script files, a `ui.R` and a `server.R` script, respectively. 

## Develop and test Shiny app locally

Open R and set session to parent directory (here `myappdir`) containing shiny script `app.R`, and the
run it with the `runApp()` function. A sample `app.R` script for testing can be downloaded from [here](https://raw.githubusercontent.com/tgirke/GEN242/main/static/custom/scripts/app.R).

```{r runshinyapp1, eval=FALSE}
library(shiny)
dir.create("myappdir")
download.file("https://raw.githubusercontent.com/tgirke/GEN242/main/static/custom/scripts/app.R", "./myappdir/app.R")
runApp("myappdir") # To show code in app, add argument: display.mode="showcase" 
```
This will open the app in a web browser.

## Deploy on web server

This can be done on local or cloud systems. An easy solution is to get an account on [shinyapps.io](http://www.shinyapps.io/)
and then deploy Shiny apps there. For details, see [here](https://shiny.rstudio.com/deploy/).

```{r deployshinyapp1, eval=FALSE}
setwd("myappdir")
library(rsconnect)
deployApp()
```

## Example Shiny app

The following Shiny app is hosted on `shinyapps.io` (here Instructor account) and embedded into the markdown (or html) source of this page
using the following iframe syntax:

```{r embedshiny, eval=FALSE}
<iframe src="https://tgirke.shinyapps.io/diamonds/" style="border: none; width: 880px; height: 900px"></iframe>
```

<iframe src="https://tgirke.shinyapps.io/diamonds/" style="border: none; width: 880px; height: 900px"></iframe>


Another example from Nick Harding using Shiny App: [volcanoshiny](https://github.com/hardingnj/volcanoshiny)

<iframe src="https://hardingnj.shinyapps.io/volcanoshiny/" style="border: none; width: 880px; height: 900px"></iframe>

Additional examples

   + Volcano Plots: [VolcaNoseR](https://huygens.science.uva.nl/VolcaNoseR/) ([publication](https://www.nature.com/articles/s41598-020-76603-3)).
   + systemPipeShiny: [web demo](https://tgirke.shinyapps.io/systemPipeShiny/) and [Bioc package](https://www.bioconductor.org/packages/release/bioc/html/systemPipeShiny.html)
   + spatialHeatmap: [web demo](https://spatialheatmap.org/) 

## Learning Shiny

The Shiny section on the Rstudio site contains excellent [tutorials](https://shiny.rstudio.com/tutorial/).
In addition, users may want to explore the example apps included in the `shiny` package. This can be
done by loading the individual examples (see [here](https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/)) or saving
the code to a user writable directory like this:

```{r learnshiny, eval=FALSE}
mydir <- system.file("examples", package="shiny")
dir.create('my_shiny_test_dir')
file.copy(mydir, "my_shiny_test_dir", recursive=TRUE)
setwd("my_shiny_test_dir/examples")
runApp("01_hello") # Runs first example app in directory 
dir() # Lists available Shiny examples (directories). 
```

## Resources to learn Shiny

### Tutorial and books 

- Long video [tutorials](https://shiny.rstudio.com/tutorial/).
- Shiny [official Lessons](https://shiny.rstudio.com/tutorial/written-tutorial/lesson1/).
- Shiny [official gallery and source code](https://shiny.rstudio.com/gallery/)
- Advanced Shiny book - [Mastering Shiny](https://mastering-shiny.org/index.html)
- Advanced web application in R book - [Javascript for R](https://book.javascript-for-r.com/)
- Shiny Tutorial by Le Zhang (UCR) - [Shiny Tutorial](https://girke.bioinformatics.ucr.edu/GEN242/tutorials/shinyappslezhang/shinyapps)

### Extension packages
- Catalog of cool extension packages - [Awesome Shiny](https://github.com/nanxstats/awesome-shiny-extensions)
- [shinyWidgets](https://github.com/dreamRs/shinyWidgets) - UI components
- [systemPipeShiny](https://systempipe.org/sps/) - A framework for workflow management and data visualization.
- [spsComps](https://systempipe.org/sps/dev/spscomps/) - UI components, animations, server components
- [shinyjs](https://deanattali.com/shinyjs/) - server end JavaScript communications

## Session Info

```{r sessionInfo}
sessionInfo()
```

## References
