Gene expression
RNA-seq
Single-cell technologies
What is it?
Common use cases
Queries
Processing
We’ll set up some data to use (pay no attention to this!)
dir <- tempdir()
if (!dir.exists(dir))
    dir.create(dir)
library(airway)
data(airway)
write.table(colData(airway), file.path(dir, "samples.csv"))
write.table(assay(airway), file.path(dir, "expression.csv"))Related data elements
samples <- read.table(file.path(dir, "samples.csv"))
samples##            SampleName    cell   dex albut        Run avgLength Experiment
## SRR1039508 GSM1275862  N61311 untrt untrt SRR1039508       126  SRX384345
## SRR1039509 GSM1275863  N61311   trt untrt SRR1039509       126  SRX384346
## SRR1039512 GSM1275866 N052611 untrt untrt SRR1039512       126  SRX384349
## SRR1039513 GSM1275867 N052611   trt untrt SRR1039513        87  SRX384350
## SRR1039516 GSM1275870 N080611 untrt untrt SRR1039516       120  SRX384353
## SRR1039517 GSM1275871 N080611   trt untrt SRR1039517       126  SRX384354
## SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520       101  SRX384357
## SRR1039521 GSM1275875 N061011   trt untrt SRR1039521        98  SRX384358
##               Sample    BioSample
## SRR1039508 SRS508568 SAMN02422669
## SRR1039509 SRS508567 SAMN02422675
## SRR1039512 SRS508571 SAMN02422678
## SRR1039513 SRS508572 SAMN02422670
## SRR1039516 SRS508575 SAMN02422682
## SRR1039517 SRS508576 SAMN02422673
## SRR1039520 SRS508579 SAMN02422683
## SRR1039521 SRS508580 SAMN02422677counts <- read.table(file.path(dir, "expression.csv"))
head(counts)##                 SRR1039508 SRR1039509 SRR1039512 SRR1039513 SRR1039516
## ENSG00000000003        679        448        873        408       1138
## ENSG00000000005          0          0          0          0          0
## ENSG00000000419        467        515        621        365        587
## ENSG00000000457        260        211        263        164        245
## ENSG00000000460         60         55         40         35         78
## ENSG00000000938          0          0          2          0          1
##                 SRR1039517 SRR1039520 SRR1039521
## ENSG00000000003       1047        770        572
## ENSG00000000005          0          0          0
## ENSG00000000419        799        417        508
## ENSG00000000457        331        233        229
## ENSG00000000460         63         76         60
## ENSG00000000938          0          0          0counts <- as.matrix(counts)Coordinate data management
samples and counts is error-prone, e.g. subset
samples but not counts, and the association of sample rows and count
columns is distrupted.library(SummarizedExperiment)
SummarizedExperiment()## class: SummarizedExperiment 
## dim: 0 0 
## metadata(0):
## assays(0):
## rownames: NULL
## rowData names(0):
## colnames: NULL
## colData names(0):An ‘S4’ object for coordinating ‘assay’ matrices with row and column annotations
se <- SummarizedExperiment(
    assays = list(counts = counts),
    colData = samples
)
se## class: SummarizedExperiment 
## dim: 64102 8 
## metadata(0):
## assays(1): counts
## rownames(64102): ENSG00000000003 ENSG00000000005 ... LRG_98 LRG_99
## rowData names(0):
## colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
## colData names(9): SampleName cell ... Sample BioSampleClasses allow the developer to make data access easy
se$dex## [1] untrt trt   untrt trt   untrt trt   untrt trt  
## Levels: trt untrtse[, se$dex == "trt"]## class: SummarizedExperiment 
## dim: 64102 4 
## metadata(0):
## assays(1): counts
## rownames(64102): ENSG00000000003 ENSG00000000005 ... LRG_98 LRG_99
## rowData names(0):
## colnames(4): SRR1039509 SRR1039513 SRR1039517 SRR1039521
## colData names(9): SampleName cell ... Sample BioSampleData manipulation, e.g., non-zero rows
idx <- rowSums(assay(se)) > 0
se[idx,]## class: SummarizedExperiment 
## dim: 33469 8 
## metadata(0):
## assays(1): counts
## rownames(33469): ENSG00000000003 ENSG00000000419 ... ENSG00000273492
##   ENSG00000273493
## rowData names(0):
## colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
## colData names(9): SampleName cell ... Sample BioSampleSimple visualize
dotchart(colSums(assay(se)), xlab = "Library size")expr <- rowSums(assay(se))
plot(density(log(expr[expr > 0])), ylab = "log expression")Not ‘better’, but different
Challenges in base R and formal objects
[ applied to a matrix usually (!)
returns a matrix, whereas rowSums() returns a vector‘tidy’ analysis
Consistent methods
filter(), select(), group_by(),
count(), summarize(), mutate(), …library(dplyr)
library(tibble)The pipe, %>%
Base R: reasoning ‘inside out’
x <- runif(10, 1, 5)
log(ceiling(x))##  [1] 1.386294 1.386294 1.386294 1.609438 1.098612 1.098612 1.609438 1.098612
##  [9] 1.386294 1.098612Procedural R
x1 <- ceiling(x)
log(x1)Tidy R – use %>% so that operations read left-to-right
x %>% ceiling() %>% log()Data representation
A tibble is like a user-friendly data.frame
as_tibble(mtcars)## # A tibble: 32 x 11
##      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
##  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
##  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
##  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
##  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
##  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
##  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
##  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
##  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
## 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
## # … with 22 more rowsRow names are just another column
sample <- tibble::rownames_to_column(
    as.data.frame(colData(se)),
    var="Accession"
) %>% as_tibble()Data is represented in ‘long-form’
count <- reshape::melt(assay(se), c("Feature", "Accession")) %>%
    as_tibble()
colnames(count)[3] = "Count"
count## # A tibble: 512,816 x 3
##    Feature         Accession  Count
##    <fct>           <fct>      <int>
##  1 ENSG00000000003 SRR1039508   679
##  2 ENSG00000000005 SRR1039508     0
##  3 ENSG00000000419 SRR1039508   467
##  4 ENSG00000000457 SRR1039508   260
##  5 ENSG00000000460 SRR1039508    60
##  6 ENSG00000000938 SRR1039508     0
##  7 ENSG00000000971 SRR1039508  3251
##  8 ENSG00000001036 SRR1039508  1433
##  9 ENSG00000001084 SRR1039508   519
## 10 ENSG00000001167 SRR1039508   394
## # … with 512,806 more rowsEndomorphism: tibble in, tibble out
cars <- rownames_to_column(mtcars, "make") %>%
    as_tibble()
cars %>% filter(cyl >= 6)## # A tibble: 21 x 12
##    make       mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
##    <chr>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 Mazda R…  21       6  160    110  3.9   2.62  16.5     0     1     4     4
##  2 Mazda R…  21       6  160    110  3.9   2.88  17.0     0     1     4     4
##  3 Hornet …  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
##  4 Hornet …  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
##  5 Valiant   18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
##  6 Duster …  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
##  7 Merc 280  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
##  8 Merc 28…  17.8     6  168.   123  3.92  3.44  18.9     1     0     4     4
##  9 Merc 45…  16.4     8  276.   180  3.07  4.07  17.4     0     0     3     3
## 10 Merc 45…  17.3     8  276.   180  3.07  3.73  17.6     0     0     3     3
## # … with 11 more rowscars %>% select(make, mpg, cyl, disp)## # A tibble: 32 x 4
##    make                mpg   cyl  disp
##    <chr>             <dbl> <dbl> <dbl>
##  1 Mazda RX4          21       6  160 
##  2 Mazda RX4 Wag      21       6  160 
##  3 Datsun 710         22.8     4  108 
##  4 Hornet 4 Drive     21.4     6  258 
##  5 Hornet Sportabout  18.7     8  360 
##  6 Valiant            18.1     6  225 
##  7 Duster 360         14.3     8  360 
##  8 Merc 240D          24.4     4  147.
##  9 Merc 230           22.8     4  141.
## 10 Merc 280           19.2     6  168.
## # … with 22 more rowsGenerally, playing well with other packages in the ‘tidyverse’
library(ggplot2)cars %>% ggplot(aes(x = factor(cyl), y = mpg)) + geom_boxplot()Create a sqlite data base
library(RSQLite)
airway_db <- file.path(dir, "airway.sqlite")
con <- dbConnect(SQLite(), airway_db)Add a sample table
sample <- tibble::rownames_to_column(
    as.data.frame(colData(se)),
    var="Accession"
)
dbWriteTable(con, "sample", sample)Add a count table, in ‘tidy’ form
count <- reshape::melt(assay(se), c("Feature", "Accession"))
colnames(count)[3] = "Count"
dbWriteTable(con, "count", count)Extract data using SQL statements
dbListTables(con)## [1] "count"  "sample"dbGetQuery(con, "SELECT * FROM Sample;")##    Accession SampleName    cell   dex albut        Run avgLength Experiment
## 1 SRR1039508 GSM1275862  N61311 untrt untrt SRR1039508       126  SRX384345
## 2 SRR1039509 GSM1275863  N61311   trt untrt SRR1039509       126  SRX384346
## 3 SRR1039512 GSM1275866 N052611 untrt untrt SRR1039512       126  SRX384349
## 4 SRR1039513 GSM1275867 N052611   trt untrt SRR1039513        87  SRX384350
## 5 SRR1039516 GSM1275870 N080611 untrt untrt SRR1039516       120  SRX384353
## 6 SRR1039517 GSM1275871 N080611   trt untrt SRR1039517       126  SRX384354
## 7 SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520       101  SRX384357
## 8 SRR1039521 GSM1275875 N061011   trt untrt SRR1039521        98  SRX384358
##      Sample    BioSample
## 1 SRS508568 SAMN02422669
## 2 SRS508567 SAMN02422675
## 3 SRS508571 SAMN02422678
## 4 SRS508572 SAMN02422670
## 5 SRS508575 SAMN02422682
## 6 SRS508576 SAMN02422673
## 7 SRS508579 SAMN02422683
## 8 SRS508580 SAMN02422677dbGetQuery(con, "SELECT Accession, cell, dex FROM Sample;")##    Accession    cell   dex
## 1 SRR1039508  N61311 untrt
## 2 SRR1039509  N61311   trt
## 3 SRR1039512 N052611 untrt
## 4 SRR1039513 N052611   trt
## 5 SRR1039516 N080611 untrt
## 6 SRR1039517 N080611   trt
## 7 SRR1039520 N061011 untrt
## 8 SRR1039521 N061011   trtdbGetQuery(con, "SELECT * FROM Count LIMIT 3;")##           Feature  Accession Count
## 1 ENSG00000000003 SRR1039508   679
## 2 ENSG00000000005 SRR1039508     0
## 3 ENSG00000000419 SRR1039508   467dbDisconnect(con)Open data base
library(dplyr)
library(dbplyr)
src <- src_sqlite(airway_db)
src## src:  sqlite 3.22.0 [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
## tbls: count, sampleManipulations on “Sample” table – standard verbs, plus collect()
tbl(src, "Sample")## # Source:   table<Sample> [?? x 10]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##   Accession SampleName cell  dex   albut Run   avgLength Experiment Sample
##   <chr>     <chr>      <chr> <chr> <chr> <chr>     <int> <chr>      <chr> 
## 1 SRR10395… GSM1275862 N613… untrt untrt SRR1…       126 SRX384345  SRS50…
## 2 SRR10395… GSM1275863 N613… trt   untrt SRR1…       126 SRX384346  SRS50…
## 3 SRR10395… GSM1275866 N052… untrt untrt SRR1…       126 SRX384349  SRS50…
## 4 SRR10395… GSM1275867 N052… trt   untrt SRR1…        87 SRX384350  SRS50…
## 5 SRR10395… GSM1275870 N080… untrt untrt SRR1…       120 SRX384353  SRS50…
## 6 SRR10395… GSM1275871 N080… trt   untrt SRR1…       126 SRX384354  SRS50…
## 7 SRR10395… GSM1275874 N061… untrt untrt SRR1…       101 SRX384357  SRS50…
## 8 SRR10395… GSM1275875 N061… trt   untrt SRR1…        98 SRX384358  SRS50…
## # … with 1 more variable: BioSample <chr>tbl(src, "Sample") %>% select(Accession, cell, dex)## # Source:   lazy query [?? x 3]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##   Accession  cell    dex  
##   <chr>      <chr>   <chr>
## 1 SRR1039508 N61311  untrt
## 2 SRR1039509 N61311  trt  
## 3 SRR1039512 N052611 untrt
## 4 SRR1039513 N052611 trt  
## 5 SRR1039516 N080611 untrt
## 6 SRR1039517 N080611 trt  
## 7 SRR1039520 N061011 untrt
## 8 SRR1039521 N061011 trttbl(src, "Sample") %>% filter(dex == "trt") %>% collect()## # A tibble: 4 x 10
##   Accession SampleName cell  dex   albut Run   avgLength Experiment Sample
##   <chr>     <chr>      <chr> <chr> <chr> <chr>     <int> <chr>      <chr> 
## 1 SRR10395… GSM1275863 N613… trt   untrt SRR1…       126 SRX384346  SRS50…
## 2 SRR10395… GSM1275867 N052… trt   untrt SRR1…        87 SRX384350  SRS50…
## 3 SRR10395… GSM1275871 N080… trt   untrt SRR1…       126 SRX384354  SRS50…
## 4 SRR10395… GSM1275875 N061… trt   untrt SRR1…        98 SRX384358  SRS50…
## # … with 1 more variable: BioSample <chr>Manipulations on “Count” table
tbl(src, "Count")## # Source:   table<Count> [?? x 3]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##    Feature         Accession  Count
##    <chr>           <chr>      <int>
##  1 ENSG00000000003 SRR1039508   679
##  2 ENSG00000000005 SRR1039508     0
##  3 ENSG00000000419 SRR1039508   467
##  4 ENSG00000000457 SRR1039508   260
##  5 ENSG00000000460 SRR1039508    60
##  6 ENSG00000000938 SRR1039508     0
##  7 ENSG00000000971 SRR1039508  3251
##  8 ENSG00000001036 SRR1039508  1433
##  9 ENSG00000001084 SRR1039508   519
## 10 ENSG00000001167 SRR1039508   394
## # … with more rowstbl(src, "Count") %>%
    group_by(Accession) %>%
    summarize(library_size = SUM(Count)) %>%
    collect()## # A tibble: 8 x 2
##   Accession  library_size
##   <chr>             <int>
## 1 SRR1039508     20637971
## 2 SRR1039509     18809481
## 3 SRR1039512     25348649
## 4 SRR1039513     15163415
## 5 SRR1039516     24448408
## 6 SRR1039517     30818215
## 7 SRR1039520     19126151
## 8 SRR1039521     21164133Relations between tables
left_join(tbl(src, "Count"), tbl(src, "Sample"))## Joining, by = "Accession"## # Source:   lazy query [?? x 12]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##    Feature Accession Count SampleName cell  dex   albut Run   avgLength
##    <chr>   <chr>     <int> <chr>      <chr> <chr> <chr> <chr>     <int>
##  1 ENSG00… SRR10395…   679 GSM1275862 N613… untrt untrt SRR1…       126
##  2 ENSG00… SRR10395…     0 GSM1275862 N613… untrt untrt SRR1…       126
##  3 ENSG00… SRR10395…   467 GSM1275862 N613… untrt untrt SRR1…       126
##  4 ENSG00… SRR10395…   260 GSM1275862 N613… untrt untrt SRR1…       126
##  5 ENSG00… SRR10395…    60 GSM1275862 N613… untrt untrt SRR1…       126
##  6 ENSG00… SRR10395…     0 GSM1275862 N613… untrt untrt SRR1…       126
##  7 ENSG00… SRR10395…  3251 GSM1275862 N613… untrt untrt SRR1…       126
##  8 ENSG00… SRR10395…  1433 GSM1275862 N613… untrt untrt SRR1…       126
##  9 ENSG00… SRR10395…   519 GSM1275862 N613… untrt untrt SRR1…       126
## 10 ENSG00… SRR10395…   394 GSM1275862 N613… untrt untrt SRR1…       126
## # … with more rows, and 3 more variables: Experiment <chr>, Sample <chr>,
## #   BioSample <chr>left_join(
    tbl(src, "Count"),
    tbl(src, "Sample") %>% select(Accession, cell, dex)
)## Joining, by = "Accession"## # Source:   lazy query [?? x 5]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##    Feature         Accession  Count cell   dex  
##    <chr>           <chr>      <int> <chr>  <chr>
##  1 ENSG00000000003 SRR1039508   679 N61311 untrt
##  2 ENSG00000000005 SRR1039508     0 N61311 untrt
##  3 ENSG00000000419 SRR1039508   467 N61311 untrt
##  4 ENSG00000000457 SRR1039508   260 N61311 untrt
##  5 ENSG00000000460 SRR1039508    60 N61311 untrt
##  6 ENSG00000000938 SRR1039508     0 N61311 untrt
##  7 ENSG00000000971 SRR1039508  3251 N61311 untrt
##  8 ENSG00000001036 SRR1039508  1433 N61311 untrt
##  9 ENSG00000001084 SRR1039508   519 N61311 untrt
## 10 ENSG00000001167 SRR1039508   394 N61311 untrt
## # … with more rowsLibrary size
Find column (Accession) counts
tbl(src, "Count") %>%
    group_by(Accession) %>%
    summarize(library_size = SUM(Count))## # Source:   lazy query [?? x 2]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##   Accession  library_size
##   <chr>             <int>
## 1 SRR1039508     20637971
## 2 SRR1039509     18809481
## 3 SRR1039512     25348649
## 4 SRR1039513     15163415
## 5 SRR1039516     24448408
## 6 SRR1039517     30818215
## 7 SRR1039520     19126151
## 8 SRR1039521     21164133Filter rows with non-zero counts
Rows with non-zero counts
keep <- tbl(src, "Count") %>%
    group_by(Feature) %>%
    summarize(row_sum = SUM(Count)) %>%
    filter(row_sum > 0) %>%
    select(Feature)left_join() to keep only these rows
left_join(keep, tbl(src, "Count"))## Joining, by = "Feature"## # Source:   lazy query [?? x 3]
## # Database: sqlite 3.22.0
## #   [/private/var/folders/yn/gmsh_22s2c55v816r6d51fx1tnyl61/T/RtmpLt7lbb/airway.sqlite]
##    Feature         Accession  Count
##    <chr>           <chr>      <int>
##  1 ENSG00000000003 SRR1039508   679
##  2 ENSG00000000003 SRR1039509   448
##  3 ENSG00000000003 SRR1039512   873
##  4 ENSG00000000003 SRR1039513   408
##  5 ENSG00000000003 SRR1039516  1138
##  6 ENSG00000000003 SRR1039517  1047
##  7 ENSG00000000003 SRR1039520   770
##  8 ENSG00000000003 SRR1039521   572
##  9 ENSG00000000419 SRR1039508   467
## 10 ENSG00000000419 SRR1039509   515
## # … with more rowslibrary(BiocFileCache)
if (nrow(bfcquery(query="SRAdb", field = "rname")) == 0L) {
    fl <- SRAdb::getSRAdbFile(tempdir())
    bfcadd(rname = "SRAdb", fpath = fl, action = "move")
}fl <- BiocFileCache::bfcrpath(rnames = "SRAdb")
src <- src_sqlite(fl)
tbl(src, "study")
tbl(src, "study") %>%
    filter(study_title %like% "%ovarian%")Data bases are appropriate for ‘relational’ data.
The ‘big’ part of scientific data is often not relational
Access patterns for databases adn scientific data often differ.
Strategy for processing data: iterate through the file
library(rhdf5)Fast ‘block-wise’ access
library(TENxBrainData)
tenx <- TENxBrainData()Illusions…
log(1 + assay(tenx))## <27998 x 1306127> DelayedMatrix object of type "double":
##            AAACCTGAGATAGGAG-1 ... TTTGTCATCTGAAAGA-133
##     [1,]                    0   .                    0
##     [2,]                    0   .                    0
##     [3,]                    0   .                    0
##     [4,]                    0   .                    0
##     [5,]                    0   .                    0
##      ...                    .   .                    .
## [27994,]            0.0000000   .                    0
## [27995,]            0.6931472   .                    0
## [27996,]            0.0000000   .                    0
## [27997,]            0.0000000   .                    0
## [27998,]            0.0000000   .                    0Subset
tenx_subset <- tenx[, sample(ncol(tenx), 200)]
count <- as.matrix(assay(tenx_subset))
dotchart(
    unname(colSums(count)),
    xlab = "Library size"
)hist(log(1 + rowSums(count)))Actually, though, chunk-wise data processing is transparent
dotchart(
    unname(colSums(assay(tenx_subset))),
    xlab = "Library size"
)A portion of this work is supported by the Chan Zuckerberg Initiative DAF, an advised fund of Silicon Valley Community Foundation.
Research reported in this presentation was supported by the NHGRI and NCI of the National Institutes of Health under award numbers U41HG004059, U24CA180996, and U24CA232979. The content is solely the responsibility of the authors and does not necessarily represent the official views of the National Institutes of Health.
This work was performed on behalf of the SOUND Consortium and funded under the EU H2020 Personalizing Health and Care Program, Action contract number 633974.
## R version 3.6.0 alpha (2019-04-03 r76311)
## Platform: x86_64-apple-darwin17.7.0 (64-bit)
## Running under: macOS High Sierra 10.13.6
## 
## Matrix products: default
## BLAS:   /Users/ma38727/bin/R-3-6-branch/lib/libRblas.dylib
## LAPACK: /Users/ma38727/bin/R-3-6-branch/lib/libRlapack.dylib
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## attached base packages:
## [1] parallel  stats4    stats     graphics  grDevices utils     datasets 
## [8] methods   base     
## 
## other attached packages:
##  [1] TENxBrainData_1.3.0         HDF5Array_1.11.11          
##  [3] SingleCellExperiment_1.5.2  rhdf5_2.27.15              
##  [5] dbplyr_1.3.0                RSQLite_2.1.1              
##  [7] ggplot2_3.1.1               tibble_2.1.1               
##  [9] dplyr_0.8.0.1               airway_1.3.0               
## [11] SummarizedExperiment_1.13.0 DelayedArray_0.9.9         
## [13] BiocParallel_1.17.18        matrixStats_0.54.0         
## [15] Biobase_2.43.1              GenomicRanges_1.35.1       
## [17] GenomeInfoDb_1.19.3         IRanges_2.17.4             
## [19] S4Vectors_0.21.22           BiocGenerics_0.29.2        
## [21] BiocStyle_2.11.0           
## 
## loaded via a namespace (and not attached):
##  [1] httr_1.4.0                    bit64_0.9-7                  
##  [3] AnnotationHub_2.15.12         shiny_1.3.0                  
##  [5] assertthat_0.2.1              interactiveDisplayBase_1.21.0
##  [7] BiocManager_1.30.4.9006       BiocFileCache_1.7.7          
##  [9] blob_1.1.1                    GenomeInfoDbData_1.2.1       
## [11] yaml_2.2.0                    pillar_1.3.1                 
## [13] lattice_0.20-38               glue_1.3.1                   
## [15] digest_0.6.18                 promises_1.0.1               
## [17] XVector_0.23.2                colorspace_1.4-1             
## [19] httpuv_1.5.1                  htmltools_0.3.6              
## [21] Matrix_1.2-17                 plyr_1.8.4                   
## [23] pkgconfig_2.0.2               bookdown_0.9                 
## [25] zlibbioc_1.29.0               xtable_1.8-3                 
## [27] purrr_0.3.2                   scales_1.0.0                 
## [29] later_0.8.0                   withr_2.1.2                  
## [31] lazyeval_0.2.2                cli_1.1.0                    
## [33] mime_0.6                      magrittr_1.5                 
## [35] crayon_1.3.4                  memoise_1.1.0                
## [37] evaluate_0.13                 fansi_0.4.0                  
## [39] tools_3.6.0                   stringr_1.4.0                
## [41] Rhdf5lib_1.5.4                munsell_0.5.0                
## [43] AnnotationDbi_1.45.1          compiler_3.6.0               
## [45] rlang_0.3.4                   grid_3.6.0                   
## [47] RCurl_1.95-4.12               rappdirs_0.3.1               
## [49] bitops_1.0-6                  labeling_0.3                 
## [51] rmarkdown_1.12                ExperimentHub_1.9.3          
## [53] gtable_0.3.0                  codetools_0.2-16             
## [55] DBI_1.0.0                     reshape_0.8.8                
## [57] curl_3.3                      R6_2.4.0                     
## [59] knitr_1.22                    bit_1.1-14                   
## [61] utf8_1.1.4                    stringi_1.4.3                
## [63] Rcpp_1.0.1                    tidyselect_0.2.5             
## [65] xfun_0.6