25  Interactive Report: Airway Data

Author
Affiliation

Dr Randy Johnson

Hood College

Published

March 5, 2026

Instructions

In today’s exercise, we’ll be writing a report on the Airway dataset published by Himes et al. (2014). The report will have both static and interactive elements, and we’ll deploy it to the Posit Connect Cloud service as well as hosting it on GitHub pages using Shinylive.

We can fork and clone this starter code from GitHub Classroom to get started.

Part 1: Create the README

To start with, recreate the report found on this page, using only static elements (i.e. create a png figure using ggplot2).

Part 2: Add interactivity and publish

Next, we will copy our code from README.qmd to Airway_shiny.qmd and add an interactive element to the report.

  • Ask your favorite AI agent to add a shiny server element in place of the figure allowing the viewer to change the significance threshold.

  • Verify that the shiny elements work locally and publish the report to the Posit Connect Cloud service.

  • Add a link to the Posit Connect Cloud deployment to your README and re-render README.md

  • Push your changes to GitHub.

Part 3: Publishing using Shinylive

We should be ready at this point to make some small changes and deploy this report using Shinylive on GitHub pages. As discussed in the lecture, we’ll need to simplify things a bit. Tidyverse packages (e.g. ggplot2) have a lot of dependencies, which can bog down WebR and cause problems with loading the interactive elements.

  • Copy the code from Airway_shiny.qmd to Airway_shinylive.qmd and ask your AI agent to adapt the file to deploy using Shinylive.

    • Tell it to change the figure to use only base-R graphics.
    • Try to deploy using only the shiny library. The fewer the number of packages, the more likely WebR is to load successfully and efficiently.
    • I think we’ll want to download the data first before reading it into R.
  • Once you have the page working locally, push to GitHub and publish to GitHub pages:

    • GitHub Pages can be enabled under your repository settings -> Pages
    • Select “Deploy from branch” under the “Build and deployment” section
    • Select the correct branch and directory and save the settings
    • We can find the link to our published pages at the top of the page
  • On the main repository page, open the “About” dalog on the right and paste the link into the website field to make it easier to find your published page in the future.

  • Also add a link to the Shinylive deployment in README.md.

Assignment

Make sure all code is pushed to GitHub and submit links to both your deployments on Blackboard (i.e. one link for the Posit Connect deployment, and one link for the GitHub pages deployment).

Study Summary

The following is a summary of the RNA-Seq analysis of airway smooth muscle cells as reported by Himes et al. (2014).

Background & Objective

Asthma is a chronic inflammatory disease of the airways, often managed using glucocorticoids (inhaled steroids). While these drugs are effective at reducing inflammation, the specific molecular mechanisms by which they act on Airway Smooth Muscle (ASM) cells—the cells responsible for airway constriction—were not fully mapped prior to this study.

The researchers aimed to use RNA-seq to:

  1. Characterize the global transcriptional response of ASM cells to glucocorticoids.

  2. Identify novel genes that might mediate the anti-inflammatory effects of these drugs.

Experimental Design

The study utilized four primary human ASM cell lines. These lines were treated with:

  • Dexamethasone: A potent synthetic glucocorticoid (1 micromolar for 18 hours).

  • Vehicle Control: To establish a baseline of gene expression.

The researchers performed high-throughput RNA sequencing (RNA-seq), generating approximately 30 million reads per sample. This allowed for a high-resolution view of the transcriptome compared to older microarray technologies.

Key Results

The analysis revealed a robust and consistent transcriptional shift across all four cell lines:

  • Differential Expression: See the volcano below for a visualization of differentially expressed genes.
#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 550

library(shiny)

gist <- "https://gist.githubusercontent.com/johnsonra/121eb61bf4b09e4258b78e341b1819e9/raw/9d4d1650713378ce59e06a21b62f940433100a81/top_2000.csv"
download.file(gist, 'top_2000.csv')
top_2000 <- read.csv('top_2000.csv')
top_2000$nl10p <- -log10(top_2000$padj)

ui <- fluidPage(
  sliderInput("threshold", label = "Significance threshold (p_adj)",
              min = 0.001, max = 0.1, value = 0.05, step = 0.001),
  plotOutput("volcano")
)

server <- function(input, output) {
  output$volcano <- renderPlot({
    top_2000$sig <- top_2000$padj < input$threshold
    cols <- adjustcolor(ifelse(top_2000$sig, 'orange', 'black'), alpha.f = 0.3)

    # sqrt-scaled y axis: transform data, then relabel
    y_ticks <- c(0, 10, 25, 50, 75, 100)
    plot(top_2000$log2FoldChange, sqrt(top_2000$nl10p),
         col = cols, pch = 16,
         xlab = expression(log[2] ~ "Fold Change"),
         ylab = expression(-log[10] ~ p),
         yaxt = 'n',
         bty = 'l')
    axis(2, at = sqrt(y_ticks), labels = y_ticks)

    legend("topright",
           legend = c(paste0("< ", input$threshold),
                      paste0("\u2265 ", input$threshold)),
           col = adjustcolor(c('orange', 'black'), alpha.f = 0.8),
           pch = 16,
           title = expression(p[adj]),
           bty = 'n')
  })
}

shinyApp(ui, server)
  • Identification of CRISPLD2: The most notable finding was the high induction of the gene CRISPLD2 (Cysteine-Rich Secretory Protein LCCL Domain Containing 2). This gene was previously known to be involved in lung development but hadn’t been strongly linked to the glucocorticoid response in asthma.

  • Functional Enrichment: Down-regulated genes were heavily involved in inflammatory pathways, including those related to cytokine activity and Chemokine signaling (e.g. CCL2, CXCL12).

  • Validation: The researchers used siRNA “knockdown” experiments to show that when CRISPLD2 is inhibited, ASM cells produce more pro-inflammatory cytokines, suggesting that CRISPLD2 is a key “brake” on inflammation.

References

Himes, Blanca E., Xiaofeng Jiang, Peter Wagner, Ruoxi Hu, Qiyu Wang, Barbara Klanderman, Reid M. Whitaker, et al. 2014. RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene That Modulates Cytokine Function in Airway Smooth Muscle Cells.” Edited by Jan Peter Tuckermann. PLoS ONE 9 (6): e99625. https://doi.org/10.1371/journal.pone.0099625.