Integration with other panels

Scenario

In this vignette, we use the example of a differential expression and pathway analysis workflow on a real data set to demonstrate how a selection made in a panel of pathway analysis results may be transmitted to other row-oriented panels in the iSEE application.

Demonstration

Example data

Experimental metadata

We use the ?airway data set.

We briefly adjust the reference level of the treatment factor to the untreated condition.

library("airway")
data("airway")
airway$dex <- relevel(airway$dex, "untrt")

Feature identifiers

We also map the Ensembl gene identifiers to more recognisable gene symbols, setting row names to a unique identifier composed of either gene symbol, gene identifier, of a concatenate of both.

Although not essential, this implicitly defines the primary piece of information displayed for genes in the live app. No information is lost in the process, as the original Ensembl identifier and the corresponding gene symbol are both stored in the rowData() of the object.

library("org.Hs.eg.db")
library("scater")
rowData(airway)[["ENSEMBL"]] <- rownames(airway)
rowData(airway)[["SYMBOL"]] <- mapIds(org.Hs.eg.db, rownames(airway), "SYMBOL", "ENSEMBL")
rowData(airway)[["uniquifyFeatureNames"]] <- uniquifyFeatureNames(
  ID = rowData(airway)[["ENSEMBL"]],
  names = rowData(airway)[["SYMBOL"]]
)
rownames(airway) <- rowData(airway)[["uniquifyFeatureNames"]]

Gene expression

We also compute log-transformed counts, for a better visualisation of differential expression in the live app.

library("scuttle")
airway <- logNormCounts(airway)

Differential expression analysis

We run a standard Limma-Voom analysis using limma::voom(), limma::lmFit(), limma::makeContrasts(), and limma::eBayes().

library("edgeR")

counts <- assay(airway, "counts")
design <- model.matrix(~ 0 + dex + cell, data = colData(airway))

keep <- filterByExpr(counts, design)
v <- voom(counts[keep,], design, plot=FALSE)
fit <- lmFit(v, design)
contr <- makeContrasts("dextrt - dexuntrt", levels = colnames(coef(fit)))
tmp <- contrasts.fit(fit, contr)
tmp <- eBayes(tmp)
res_limma <- topTable(tmp, sort.by = "P", n = Inf)
head(res_limma)
#>             logFC  AveExpr         t      P.Value    adj.P.Val        B
#> CACNB2   3.205598 3.682244  36.49009 2.370569e-11 3.996779e-07 16.03257
#> DUSP1    2.864775 6.644455  28.95296 2.000429e-10 9.657686e-07 14.66891
#> MAOA     3.256099 5.950559  28.29381 2.472372e-10 9.657686e-07 14.44796
#> SPARCL1  4.489075 4.166904  27.99497 2.725926e-10 9.657686e-07 14.01663
#> PRSS35  -2.828186 3.224885 -27.47899 3.234271e-10 9.657686e-07 13.80831
#> STEAP2   1.894563 6.790009  26.91396 3.914512e-10 9.657686e-07 14.03974

Then, we embed this set of differential expression results in the ?airway object using the iSEEde::embedContrastResults() method.

library("iSEEde")
airway <- iSEEde::embedContrastResults(res_limma, airway, name = "Limma-Voom", class = "limma")
rowData(airway)
#> DataFrame with 63677 rows and 14 columns
#>                         gene_id     gene_name  entrezid   gene_biotype gene_seq_start gene_seq_end
#>                     <character>   <character> <integer>    <character>      <integer>    <integer>
#> TSPAN6          ENSG00000000003        TSPAN6        NA protein_coding       99883667     99894988
#> TNMD            ENSG00000000005          TNMD        NA protein_coding       99839799     99854882
#> DPM1            ENSG00000000419          DPM1        NA protein_coding       49551404     49575092
#> SCYL3           ENSG00000000457         SCYL3        NA protein_coding      169818772    169863408
#> FIRRM           ENSG00000000460      C1orf112        NA protein_coding      169631245    169823221
#> ...                         ...           ...       ...            ...            ...          ...
#> ENSG00000273489 ENSG00000273489 RP11-180C16.1        NA      antisense      131178723    131182453
#> ENSG00000273490 ENSG00000273490        TSEN34        NA protein_coding       54693789     54697585
#> ENSG00000273491 ENSG00000273491  RP11-138A9.2        NA        lincRNA      130600118    130603315
#> APP-DT          ENSG00000273492    AP000230.1        NA        lincRNA       27543189     27589700
#> ENSG00000273493 ENSG00000273493  RP11-80H18.4        NA        lincRNA       58315692     58315845
#>                              seq_name seq_strand seq_coord_system        symbol         ENSEMBL      SYMBOL
#>                           <character>  <integer>        <integer>   <character>     <character> <character>
#> TSPAN6                              X         -1               NA        TSPAN6 ENSG00000000003      TSPAN6
#> TNMD                                X          1               NA          TNMD ENSG00000000005        TNMD
#> DPM1                               20         -1               NA          DPM1 ENSG00000000419        DPM1
#> SCYL3                               1         -1               NA         SCYL3 ENSG00000000457       SCYL3
#> FIRRM                               1          1               NA      C1orf112 ENSG00000000460       FIRRM
#> ...                               ...        ...              ...           ...             ...         ...
#> ENSG00000273489                     7         -1               NA RP11-180C16.1 ENSG00000273489          NA
#> ENSG00000273490 HSCHR19LRC_LRC_J_CTG1          1               NA        TSEN34 ENSG00000273490          NA
#> ENSG00000273491          HG1308_PATCH          1               NA  RP11-138A9.2 ENSG00000273491          NA
#> APP-DT                             21          1               NA    AP000230.1 ENSG00000273492      APP-DT
#> ENSG00000273493                     3          1               NA  RP11-80H18.4 ENSG00000273493          NA
#>                 uniquifyFeatureNames             iSEEde
#>                          <character>        <DataFrame>
#> TSPAN6                        TSPAN6 <iSEELimmaResults>
#> TNMD                            TNMD <iSEELimmaResults>
#> DPM1                            DPM1 <iSEELimmaResults>
#> SCYL3                          SCYL3 <iSEELimmaResults>
#> FIRRM                          FIRRM <iSEELimmaResults>
#> ...                              ...                ...
#> ENSG00000273489      ENSG00000273489 <iSEELimmaResults>
#> ENSG00000273490      ENSG00000273490 <iSEELimmaResults>
#> ENSG00000273491      ENSG00000273491 <iSEELimmaResults>
#> APP-DT                        APP-DT <iSEELimmaResults>
#> ENSG00000273493      ENSG00000273493 <iSEELimmaResults>

Pathways

We prepare Gene Ontology gene sets of biological pathways using org.Hs.eg.db.

Due to the use of uniquifyFeatureNames() above, we must first map pathway identifiers to the unique Ensembl gene identifier, to accurately perform pathway analysis using the feature identifiers matching those of the embedded differential expression results.

library("org.Hs.eg.db")
pathways <- select(org.Hs.eg.db, keys(org.Hs.eg.db, "ENSEMBL"), c("GOALL"), keytype = "ENSEMBL")
#> 'select()' returned 1:many mapping between keys and columns
pathways <- subset(pathways, ONTOLOGYALL == "BP")
pathways <- unique(pathways[, c("ENSEMBL", "GOALL")])
pathways <- merge(pathways, rowData(airway)[, c("ENSEMBL", "uniquifyFeatureNames")])
pathways <- split(pathways$uniquifyFeatureNames, pathways$GOALL)

Mapping pathways to genes

Separately, we define and register a function that fetches the gene identifiers associated with a given pathway identifier. This function is required to transmit selections from pathway-level panels to feature-level panels.

Due to the use of uniquifyFeatureNames() above, the function must first map to the unique Ensembl gene identifier, to accurately identify the corresponding value in rownames(airway).

map_GO <- function(pathway_id, se) {
    pathway_ensembl <- mapIds(org.Hs.eg.db, pathway_id, "ENSEMBL", keytype = "GOALL", multiVals = "CharacterList")[[pathway_id]]
    pathway_rownames <- rownames(se)[rowData(se)[["gene_id"]] %in% pathway_ensembl]
    pathway_rownames
}
airway <- registerAppOptions(airway, Pathways.map.functions = list(GO = map_GO))

Gene set enrichment analysis

We run a standard GSEA analysis using fgsea.

library("fgsea")
set.seed(42)
stats <- na.omit(log2FoldChange(contrastResults(airway, "Limma-Voom")))
fgseaRes <- fgsea(pathways = pathways, 
                  stats    = stats,
                  minSize  = 15,
                  maxSize  = 500)
#> Warning in preparePathwaysAndStats(pathways, stats, minSize, maxSize, gseaParam, : There are ties in the preranked stats (0.05% of the list).
#> The order of those tied genes will be arbitrary, which may produce unexpected results.
head(fgseaRes[order(pval), ])
#>       pathway         pval        padj   log2err        ES      NES  size  leadingEdge
#>        <char>        <num>       <num>     <num>     <num>    <num> <int>       <list>
#> 1: GO:0046323 9.103491e-07 0.003970943 0.6594444 0.6486846 2.224200    60 KLF15, L....
#> 2: GO:0010827 6.238470e-06 0.009773977 0.6105269 0.6201464 2.121587    58 KLF15, L....
#> 3: GO:1904659 6.853398e-06 0.009773977 0.6105269 0.5632978 2.059816    85 KLF15, L....
#> 4: GO:0046324 8.962840e-06 0.009773977 0.5933255 0.6682559 2.181621    46 KLF15, L....
#> 5: GO:0031589 1.236526e-05 0.010787455 0.5933255 0.3877520 1.654913   289 FAM107A,....
#> 6: GO:0008645 1.627544e-05 0.011832248 0.5756103 0.5465959 2.003417    87 KLF15, L....

Then, we embed this set of pathway analysis results in the airway object, using the ?iSEEpathways::embedPathwaysResults method.

But first, we reorder the results by increasing p-value. Although not essential, this implicitly defines the default ordering of the table in the live app.

library("iSEEpathways")
fgseaRes <- fgseaRes[order(pval), ]
airway <- embedPathwaysResults(
  fgseaRes, airway, name = "fgsea (p-value)", class = "fgsea",
  pathwayType = "GO", pathwaysList = pathways, featuresStats = stats)
airway
#> class: RangedSummarizedExperiment 
#> dim: 63677 8 
#> metadata(3): '' iSEE iSEEpathways
#> assays(2): counts logcounts
#> rownames(63677): TSPAN6 TNMD ... APP-DT ENSG00000273493
#> rowData names(14): gene_id gene_name ... uniquifyFeatureNames iSEEde
#> colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
#> colData names(9): SampleName cell ... Sample BioSample

To showcase a choice of pathway analysis results in the live app, we repeat the process above, this time sorting by a different score that combines the log-transformed p-value and the absolute log-transformed fold-change.

stats <- na.omit(
  log2FoldChange(contrastResults(airway, "Limma-Voom")) *
  -log10(pValue(contrastResults(airway, "Limma-Voom")))
)
set.seed(42)
fgseaRes <- fgsea(pathways = pathways, 
                  stats    = na.omit(stats),
                  minSize  = 15,
                  maxSize  = 500)
fgseaRes <- fgseaRes[order(pval), ]
airway <- embedPathwaysResults(
  fgseaRes, airway, name = "fgsea (p-value & fold-change)", class = "fgsea",
  pathwayType = "GO", pathwaysList = pathways, featuresStats = stats)
airway
#> class: RangedSummarizedExperiment 
#> dim: 63677 8 
#> metadata(3): '' iSEE iSEEpathways
#> assays(2): counts logcounts
#> rownames(63677): TSPAN6 TNMD ... APP-DT ENSG00000273493
#> rowData names(14): gene_id gene_name ... uniquifyFeatureNames iSEEde
#> colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
#> colData names(9): SampleName cell ... Sample BioSample

Displaying additional pathway information

For further user-friendliness in the live app, we define and register a function that displays details for the selected Gene Ontology gene set using the GO.db package.

library("GO.db")
library("shiny")
library("iSEE")
go_details <- function(x) {
    info <- select(GO.db, x, c("TERM", "ONTOLOGY", "DEFINITION"), "GOID")
    html <- list(p(strong(info$GOID), ":", info$TERM, paste0("(", info$ONTOLOGY, ")")))
    if (!is.na(info$DEFINITION)) {
        html <- append(html, list(p(info$DEFINITION)))
    }
    tagList(html)
}
airway <- registerAppOptions(airway, PathwaysTable.select.details = go_details)

Live app

Finally, we configure the initial state and launch the live app.

app <- iSEE(airway, initial = list(
  PathwaysTable(ResultName="fgsea (p-value)", Selected = "GO:0046324", PanelWidth = 4L),
  VolcanoPlot(RowSelectionSource = "PathwaysTable1", ColorBy = "Row selection", PanelWidth = 4L),
  ComplexHeatmapPlot(RowSelectionSource = "PathwaysTable1",
      PanelWidth = 4L, PanelHeight = 700L,
      CustomRows = FALSE, ColumnData = "dex",
      ClusterRows = TRUE, ClusterRowsDistance = "euclidean", AssayCenterRows = TRUE),
  FgseaEnrichmentPlot(ResultName="fgsea (p-value)", PathwayId = "GO:0046324", PanelWidth = 12L)
))

if (interactive()) {
  shiny::runApp(app)
}

Trading off memory usage for speed

The function map_GO() that we defined earlier above – to map a pathway identifier to a set of gene identifiers – uses the org.Hs.eg.db package and the ?AnnotationDbi::select() function.

While memory-efficient, the repeated calls to the database of gene annotations introduce a bottleneck that limits the reactivity of the app.

We can improve the speed of the app rendering by trading off an increased memory usage. Specifically, we can use the object pathways that we created earlier as a named list of pathway identifiers and character vectors of gene identifiers associated with each pathway, instead of querying the GO.db database.

First, for the app to be self-contained, the list of pathways should be stored within the airway object itself. For instance, we store those in the metadata() of the airway object.

metadata(airway)[["pathways"]] <- list(GO = pathways)

Then, we can write a new, faster, function that fetches gene identifiers directly from that list rather than the database. The function should take as first argument a single pathway identifier, and the second argument must be called se to match the name of the SummarizedExperiment object used within the app.

As a a trade off, the app now relies on the list of pathway annotations being available in the metadata of the se object, using additional memory for the benefit of dramatically faster access.

map_GO_v2 <- function(pathway_id, se) {
    pathway_list <- metadata(se)[["pathways"]][["GO"]]
    if (!pathway_id %in% names(pathway_list)) {
        warning("Pathway identifier %s not found.", sQuote(pathway_id))
        return(character(0))
    }
    pathway_list[[pathway_id]]
}
airway <- registerAppOptions(airway, Pathways.map.functions = list(GO = map_GO_v2))

We can then launch a new instance of the app, using the same initial configuration, but the update airway object.

app <- iSEE(airway, initial = list(
  PathwaysTable(ResultName="fgsea (p-value)", Selected = "GO:0046324", PanelWidth = 4L),
  VolcanoPlot(RowSelectionSource = "PathwaysTable1", ColorBy = "Row selection", PanelWidth = 4L),
  ComplexHeatmapPlot(RowSelectionSource = "PathwaysTable1",
      PanelWidth = 4L, PanelHeight = 700L,
      CustomRows = FALSE, ColumnData = "dex",
      ClusterRows = TRUE, ClusterRowsDistance = "euclidean", AssayCenterRows = TRUE),
  FgseaEnrichmentPlot(ResultName="fgsea (p-value)", PathwayId = "GO:0046324", PanelWidth = 12L)
))

if (interactive()) {
  shiny::runApp(app)
}

Reproducibility

The iSEEpathways package (Rue-Albrecht and Soneson, 2024) was made possible thanks to:

This package was developed using biocthis.

Code for creating the vignette

## Create the vignette
library("rmarkdown")
system.time(render("integration.Rmd", "BiocStyle::html_document"))

## Extract the R code
library("knitr")
knit("integration.Rmd", tangle = TRUE)

Date the vignette was generated.

#> [1] "2024-11-29 07:30:30 UTC"

Wallclock time spent generating the vignette.

#> Time difference of 43.216 secs

R session information.

#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.4.2 (2024-10-31)
#>  os       Ubuntu 24.04.1 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language (EN)
#>  collate  C
#>  ctype    en_US.UTF-8
#>  tz       Etc/UTC
#>  date     2024-11-29
#>  pandoc   3.2.1 @ /usr/local/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package              * version  date (UTC) lib source
#>  abind                  1.4-8    2024-09-12 [2] RSPM (R 4.4.0)
#>  airway               * 1.26.0   2024-10-31 [2] Bioconductor 3.20 (R 4.4.2)
#>  AnnotationDbi        * 1.69.0   2024-11-29 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  backports              1.5.0    2024-05-23 [2] RSPM (R 4.4.0)
#>  beachmat               2.23.2   2024-11-26 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  beeswarm               0.4.0    2021-06-01 [2] RSPM (R 4.4.0)
#>  bibtex                 0.5.1    2023-01-26 [2] RSPM (R 4.4.0)
#>  Biobase              * 2.67.0   2024-10-31 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  BiocGenerics         * 0.53.3   2024-11-15 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  BiocManager            1.30.25  2024-08-28 [2] RSPM (R 4.4.0)
#>  BiocNeighbors          2.1.1    2024-11-29 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  BiocParallel           1.41.0   2024-11-29 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  BiocSingular           1.23.0   2024-11-19 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  BiocStyle            * 2.35.0   2024-11-19 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  Biostrings             2.75.1   2024-11-07 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  bit                    4.5.0    2024-09-20 [2] RSPM (R 4.4.0)
#>  bit64                  4.5.2    2024-09-22 [2] RSPM (R 4.4.0)
#>  blob                   1.2.4    2023-03-17 [2] RSPM (R 4.4.0)
#>  bslib                  0.8.0    2024-07-29 [2] RSPM (R 4.4.0)
#>  buildtools             1.0.0    2024-11-24 [3] local (/pkg)
#>  cachem                 1.1.0    2024-05-16 [2] RSPM (R 4.4.0)
#>  circlize               0.4.16   2024-02-20 [2] RSPM (R 4.4.0)
#>  cli                    3.6.3    2024-06-21 [2] RSPM (R 4.4.0)
#>  clue                   0.3-66   2024-11-13 [2] RSPM (R 4.4.0)
#>  cluster                2.1.6    2023-12-01 [2] RSPM (R 4.4.0)
#>  codetools              0.2-20   2024-03-31 [2] RSPM (R 4.4.0)
#>  colorspace             2.1-1    2024-07-26 [2] RSPM (R 4.4.0)
#>  colourpicker           1.3.0    2023-08-21 [2] RSPM (R 4.4.0)
#>  ComplexHeatmap         2.23.0   2024-11-29 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  cowplot                1.1.3    2024-01-22 [2] RSPM (R 4.4.0)
#>  crayon                 1.5.3    2024-06-20 [2] RSPM (R 4.4.0)
#>  data.table             1.16.2   2024-10-10 [2] RSPM (R 4.4.0)
#>  DBI                    1.2.3    2024-06-02 [2] RSPM (R 4.4.0)
#>  DelayedArray           0.33.2   2024-11-15 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  DESeq2                 1.47.1   2024-11-15 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  digest                 0.6.37   2024-08-19 [2] RSPM (R 4.4.0)
#>  doParallel             1.0.17   2022-02-07 [2] RSPM (R 4.4.0)
#>  DT                     0.33     2024-04-04 [2] RSPM (R 4.4.0)
#>  edgeR                * 4.5.0    2024-10-31 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  evaluate               1.0.1    2024-10-10 [2] RSPM (R 4.4.0)
#>  fansi                  1.0.6    2023-12-08 [2] RSPM (R 4.4.0)
#>  fastmap                1.2.0    2024-05-15 [2] RSPM (R 4.4.0)
#>  fastmatch              1.1-4    2023-08-18 [2] RSPM (R 4.4.0)
#>  fgsea                * 1.33.0   2024-11-19 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  fontawesome            0.5.3    2024-11-16 [2] RSPM (R 4.4.0)
#>  foreach                1.5.2    2022-02-02 [2] RSPM (R 4.4.0)
#>  generics             * 0.1.3    2022-07-05 [2] RSPM (R 4.4.0)
#>  GenomeInfoDb         * 1.43.2   2024-11-28 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  GenomeInfoDbData       1.2.13   2024-11-29 [2] Bioconductor
#>  GenomicRanges        * 1.59.1   2024-11-19 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  GetoptLong             1.0.5    2020-12-15 [2] RSPM (R 4.4.0)
#>  ggbeeswarm             0.7.2    2023-04-29 [2] RSPM (R 4.4.0)
#>  ggplot2              * 3.5.1    2024-04-23 [2] RSPM (R 4.4.0)
#>  ggrepel                0.9.6    2024-09-07 [2] RSPM (R 4.4.0)
#>  GlobalOptions          0.1.2    2020-06-10 [2] RSPM (R 4.4.0)
#>  glue                   1.8.0    2024-09-30 [2] RSPM (R 4.4.0)
#>  GO.db                * 3.20.0   2024-11-29 [2] Bioconductor
#>  gridExtra              2.3      2017-09-09 [2] RSPM (R 4.4.0)
#>  gtable                 0.3.6    2024-10-25 [2] RSPM (R 4.4.0)
#>  htmltools              0.5.8.1  2024-04-04 [2] RSPM (R 4.4.0)
#>  htmlwidgets            1.6.4    2023-12-06 [2] RSPM (R 4.4.0)
#>  httpuv                 1.6.15   2024-03-26 [2] RSPM (R 4.4.0)
#>  httr                   1.4.7    2023-08-15 [2] RSPM (R 4.4.0)
#>  igraph                 2.1.1    2024-10-19 [2] RSPM (R 4.4.0)
#>  IRanges              * 2.41.1   2024-11-17 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  irlba                  2.3.5.1  2022-10-03 [2] RSPM (R 4.4.0)
#>  iSEE                 * 2.19.0   2024-10-30 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  iSEEde               * 1.5.0    2024-11-03 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  iSEEpathways         * 1.5.0    2024-11-29 [1] https://bioc.r-universe.dev (R 4.4.2)
#>  iterators              1.0.14   2022-02-05 [2] RSPM (R 4.4.0)
#>  jquerylib              0.1.4    2021-04-26 [2] RSPM (R 4.4.0)
#>  jsonlite               1.8.9    2024-09-20 [2] RSPM (R 4.4.0)
#>  KEGGREST               1.47.0   2024-10-30 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  knitr                  1.49     2024-11-08 [2] RSPM (R 4.4.0)
#>  later                  1.4.1    2024-11-27 [2] RSPM (R 4.4.0)
#>  lattice                0.22-6   2024-03-20 [2] RSPM (R 4.4.0)
#>  lifecycle              1.0.4    2023-11-07 [2] RSPM (R 4.4.0)
#>  limma                * 3.63.2   2024-11-11 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  listviewer             4.0.0    2023-09-30 [2] RSPM (R 4.4.0)
#>  locfit                 1.5-9.10 2024-06-24 [2] RSPM (R 4.4.0)
#>  lubridate              1.9.3    2023-09-27 [2] RSPM (R 4.4.0)
#>  magrittr               2.0.3    2022-03-30 [2] RSPM (R 4.4.0)
#>  maketools              1.3.1    2024-10-04 [3] RSPM (R 4.4.0)
#>  Matrix                 1.7-1    2024-10-18 [2] RSPM (R 4.4.0)
#>  MatrixGenerics       * 1.19.0   2024-11-06 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  matrixStats          * 1.4.1    2024-09-08 [2] RSPM (R 4.4.0)
#>  memoise                2.0.1    2021-11-26 [2] RSPM (R 4.4.0)
#>  mgcv                   1.9-1    2023-12-21 [2] RSPM (R 4.4.0)
#>  mime                   0.12     2021-09-28 [2] RSPM (R 4.4.0)
#>  miniUI                 0.1.1.1  2018-05-18 [2] RSPM (R 4.4.0)
#>  munsell                0.5.1    2024-04-01 [2] RSPM (R 4.4.0)
#>  nlme                   3.1-166  2024-08-14 [2] RSPM (R 4.4.0)
#>  org.Hs.eg.db         * 3.20.0   2024-11-29 [2] Bioconductor
#>  pillar                 1.9.0    2023-03-22 [2] RSPM (R 4.4.0)
#>  pkgconfig              2.0.3    2019-09-22 [2] RSPM (R 4.4.0)
#>  plyr                   1.8.9    2023-10-02 [2] RSPM (R 4.4.0)
#>  png                    0.1-8    2022-11-29 [2] RSPM (R 4.4.0)
#>  promises               1.3.2    2024-11-28 [2] RSPM (R 4.4.0)
#>  R6                     2.5.1    2021-08-19 [2] RSPM (R 4.4.0)
#>  RColorBrewer           1.1-3    2022-04-03 [2] RSPM (R 4.4.0)
#>  Rcpp                   1.0.13-1 2024-11-02 [2] RSPM (R 4.4.0)
#>  RefManageR           * 1.4.0    2022-09-30 [2] RSPM (R 4.4.0)
#>  rintrojs               0.3.4    2024-01-11 [2] RSPM (R 4.4.0)
#>  rjson                  0.2.23   2024-09-16 [2] RSPM (R 4.4.0)
#>  rlang                  1.1.4    2024-06-04 [2] RSPM (R 4.4.0)
#>  rmarkdown              2.29     2024-11-04 [2] RSPM (R 4.4.0)
#>  RSQLite                2.3.8    2024-11-17 [2] RSPM (R 4.4.0)
#>  rsvd                   1.0.5    2021-04-16 [2] RSPM (R 4.4.0)
#>  S4Arrays               1.7.1    2024-11-18 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  S4Vectors            * 0.45.2   2024-11-16 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  sass                   0.4.9    2024-03-15 [2] RSPM (R 4.4.0)
#>  ScaledMatrix           1.15.0   2024-11-14 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  scales                 1.3.0    2023-11-28 [2] RSPM (R 4.4.0)
#>  scater               * 1.35.0   2024-10-31 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  scuttle              * 1.17.0   2024-10-31 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  sessioninfo          * 1.2.2    2021-12-06 [2] RSPM (R 4.4.0)
#>  shape                  1.4.6.1  2024-02-23 [2] RSPM (R 4.4.0)
#>  shiny                * 1.9.1    2024-08-01 [2] RSPM (R 4.4.0)
#>  shinyAce               0.4.3    2024-10-19 [2] RSPM (R 4.4.0)
#>  shinydashboard         0.7.2    2021-09-30 [2] RSPM (R 4.4.0)
#>  shinyjs                2.1.0    2021-12-23 [2] RSPM (R 4.4.0)
#>  shinyWidgets           0.8.7    2024-09-23 [2] RSPM (R 4.4.0)
#>  SingleCellExperiment * 1.29.1   2024-11-09 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  SparseArray            1.7.2    2024-11-15 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  statmod                1.5.0    2023-01-06 [2] RSPM (R 4.4.0)
#>  stringi                1.8.4    2024-05-06 [2] RSPM (R 4.4.0)
#>  stringr                1.5.1    2023-11-14 [2] RSPM (R 4.4.0)
#>  SummarizedExperiment * 1.37.0   2024-11-21 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  sys                    3.4.3    2024-10-04 [2] RSPM (R 4.4.0)
#>  tibble                 3.2.1    2023-03-20 [2] RSPM (R 4.4.0)
#>  timechange             0.3.0    2024-01-18 [2] RSPM (R 4.4.0)
#>  UCSC.utils             1.3.0    2024-10-31 [2] https://bioc.r-universe.dev (R 4.4.1)
#>  utf8                   1.2.4    2023-10-22 [2] RSPM (R 4.4.0)
#>  vctrs                  0.6.5    2023-12-01 [2] RSPM (R 4.4.0)
#>  vipor                  0.4.7    2023-12-18 [2] RSPM (R 4.4.0)
#>  viridis                0.6.5    2024-01-29 [2] RSPM (R 4.4.0)
#>  viridisLite            0.4.2    2023-05-02 [2] RSPM (R 4.4.0)
#>  withr                  3.0.2    2024-10-28 [2] RSPM (R 4.4.0)
#>  xfun                   0.49     2024-10-31 [2] RSPM (R 4.4.0)
#>  xml2                   1.3.6    2023-12-04 [2] RSPM (R 4.4.0)
#>  xtable                 1.8-4    2019-04-21 [2] RSPM (R 4.4.0)
#>  XVector                0.47.0   2024-11-21 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  yaml                   2.3.10   2024-07-26 [2] RSPM (R 4.4.0)
#>  zlibbioc               1.52.0   2024-10-29 [2] Bioconductor 3.20 (R 4.4.2)
#> 
#>  [1] /tmp/Rtmp4t7Vq1/Rinst23742b0fce94
#>  [2] /github/workspace/pkglib
#>  [3] /usr/local/lib/R/site-library
#>  [4] /usr/lib/R/site-library
#>  [5] /usr/lib/R/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Bibliography

This vignette was generated using BiocStyle (Oleś, 2024) with knitr (Xie, 2024) and rmarkdown (Allaire, Xie, Dervieux et al., 2024) running behind the scenes.

Citations made with RefManageR (McLean, 2017).

[1] J. Allaire, Y. Xie, C. Dervieux, et al. rmarkdown: Dynamic Documents for R. R package version 2.29. 2024. URL: https://github.com/rstudio/rmarkdown.

[2] M. W. McLean. “RefManageR: Import and Manage BibTeX and BibLaTeX References in R”. In: The Journal of Open Source Software (2017). DOI: 10.21105/joss.00338.

[3] A. Oleś. BiocStyle: Standard styles for vignettes and other Bioconductor documents. R package version 2.35.0. 2024. URL: https://github.com/Bioconductor/BiocStyle.

[4] R Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. Vienna, Austria, 2024. URL: https://www.R-project.org/.

[5] K. Rue-Albrecht and C. Soneson. iSEEpathways: iSEE extension for panels related to pathway analysis. R package version 1.5.0. 2024. URL: https://github.com/iSEE/iSEEpathways.

[6] H. Wickham. “testthat: Get Started with Testing”. In: The R Journal 3 (2011), pp. 5–10. URL: https://journal.r-project.org/archive/2011-1/RJournal_2011-1_Wickham.pdf.

[7] H. Wickham, W. Chang, R. Flight, et al. sessioninfo: R Session Information. R package version 1.2.2, https://r-lib.github.io/sessioninfo/. 2021. URL: https://github.com/r-lib/sessioninfo#readme.

[8] Y. Xie. knitr: A General-Purpose Package for Dynamic Report Generation in R. R package version 1.49. 2024. URL: https://yihui.org/knitr/.