Using annotations to facilitate interactive exploration

Example data

In this example, we use the ?airway data set.

library("airway")
data("airway")

Annotating data

This section demonstrates one of many possible workflows for adding annotations to the data set. Those annotations are meant to make it easier for users to identify genes of interest, e.g. by displaying both gene symbols and ENSEMBL gene identifiers as tooltips in the interactive browser.

First, we make a copy of the Ensembl identifiers – currently stored in the rownames() – to a column in the rowData() component.

rowData(airway)[["ENSEMBL"]] <- rownames(airway)

Then, we use the org.Hs.eg.db package to map the Ensembl identifiers to gene symbols. We store those gene symbols as an additional column of the rowData() component.

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

Next, we use the uniquifyFeatureNames() function of the scuttle package to replace the rownames() by a unique identifier that is generated as follows:

  • The gene symbol if it is unique.
  • A concatenate of the gene symbol and Ensembl gene identifier if the gene symbol is not unique.
  • The Ensembl identifier if the gene symbol is not available.
library("scuttle")
rownames(airway) <- uniquifyFeatureNames(
    ID = rowData(airway)[["ENSEMBL"]],
    names = rowData(airway)[["SYMBOL"]]
)
airway
#> class: RangedSummarizedExperiment 
#> dim: 63677 8 
#> metadata(1): ''
#> assays(1): counts
#> rownames(63677): TSPAN6 TNMD ... APP-DT ENSG00000273493
#> rowData names(12): gene_id gene_name ... ENSEMBL SYMBOL
#> colnames(8): SRR1039508 SRR1039509 ... SRR1039520 SRR1039521
#> colData names(9): SampleName cell ... Sample BioSample

Differential expression

To generate some example results, we first use edgeR::filterByExpr() to remove genes whose counts are too low to support a rigorous differential expression analysis. Then we run a standard Limma-Voom analysis using edgeR::voomLmFit(), limma::makeContrasts(), and limma::eBayes(); alternatively, we could have used limma::treat() instead of limma::eBayes().

The linear model includes the dex and cell covariates, indicating the treatment conditions and cell types, respectively. Here, we are interested in differences between treatments, adjusted by cell type, and define this comparison as the dextrt - dexuntrt contrast.

The final differential expression results are fetched using limma::topTable().

library("edgeR")

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

keep <- filterByExpr(airway, design)
fit <- voomLmFit(airway[keep, ], design, plot = FALSE)
contr <- makeContrasts("dextrt - dexuntrt", levels = design)
fit <- contrasts.fit(fit, contr)
fit <- eBayes(fit)
res_limma <- topTable(fit, sort.by = "P", n = Inf)
head(res_limma)
#>                 gene_id gene_name entrezid   gene_biotype gene_seq_start gene_seq_end seq_name
#> CACNB2  ENSG00000165995    CACNB2       NA protein_coding       18429606     18830798       10
#> DUSP1   ENSG00000120129     DUSP1       NA protein_coding      172195093    172198198        5
#> PRSS35  ENSG00000146250    PRSS35       NA protein_coding       84222194     84235423        6
#> MAOA    ENSG00000189221      MAOA       NA protein_coding       43515467     43606068        X
#> STEAP2  ENSG00000157214    STEAP2       NA protein_coding       89796904     89867451        7
#> SPARCL1 ENSG00000152583   SPARCL1       NA protein_coding       88394487     88452213        4
#>         seq_strand seq_coord_system  symbol         ENSEMBL  SYMBOL     logFC  AveExpr         t
#> CACNB2           1               NA  CACNB2 ENSG00000165995  CACNB2  3.205606 3.682244  37.68303
#> DUSP1           -1               NA   DUSP1 ENSG00000120129   DUSP1  2.864778 6.644455  28.50569
#> PRSS35           1               NA  PRSS35 ENSG00000146250  PRSS35 -2.828184 3.224885 -28.10830
#> MAOA             1               NA    MAOA ENSG00000189221    MAOA  3.256085 5.950559  27.66135
#> STEAP2           1               NA  STEAP2 ENSG00000157214  STEAP2  1.894559 6.790009  27.40834
#> SPARCL1         -1               NA SPARCL1 ENSG00000152583 SPARCL1  4.489009 4.166904  27.34820
#>              P.Value    adj.P.Val        B
#> CACNB2  1.115938e-10 1.881472e-06 14.45518
#> DUSP1   1.148539e-09 4.309046e-06 13.01074
#> PRSS35  1.291089e-09 4.309046e-06 12.44376
#> MAOA    1.475547e-09 4.309046e-06 12.75540
#> STEAP2  1.592916e-09 4.309046e-06 12.71210
#> SPARCL1 1.622327e-09 4.309046e-06 12.33402

Then, we embed this set of differential expression results in the airway object using the embedContrastResults() method and we use the function contrastResults() to display the contrast results stored in the airway object.

library(iSEEde)
#> Loading required package: iSEE
airway <- embedContrastResults(res_limma, airway,
    name = "dextrt - dexuntrt",
    class = "limma"
)
contrastResults(airway)
#> DataFrame with 63677 rows and 1 column
#>                  dextrt - dexuntrt
#>                 <iSEELimmaResults>
#> TSPAN6          <iSEELimmaResults>
#> TNMD            <iSEELimmaResults>
#> DPM1            <iSEELimmaResults>
#> SCYL3           <iSEELimmaResults>
#> FIRRM           <iSEELimmaResults>
#> ...                            ...
#> ENSG00000273489 <iSEELimmaResults>
#> ENSG00000273490 <iSEELimmaResults>
#> ENSG00000273491 <iSEELimmaResults>
#> APP-DT          <iSEELimmaResults>
#> ENSG00000273493 <iSEELimmaResults>
contrastResults(airway, "dextrt - dexuntrt")
#> iSEELimmaResults with 63677 rows and 18 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                         NA          NA        NA             NA             NA           NA
#> 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              NA          NA        NA             NA             NA           NA
#> ENSG00000273490              NA          NA        NA             NA             NA           NA
#> ENSG00000273491              NA          NA        NA             NA             NA           NA
#> APP-DT                       NA          NA        NA             NA             NA           NA
#> ENSG00000273493              NA          NA        NA             NA             NA           NA
#>                    seq_name seq_strand seq_coord_system      symbol         ENSEMBL      SYMBOL
#>                 <character>  <integer>        <integer> <character>     <character> <character>
#> TSPAN6                    X         -1               NA      TSPAN6 ENSG00000000003      TSPAN6
#> TNMD                     NA         NA               NA          NA              NA          NA
#> DPM1                     20         -1               NA        DPM1 ENSG00000000419        DPM1
#> SCYL3                     1         -1               NA       SCYL3 ENSG00000000457       SCYL3
#> FIRRM                     1          1               NA    C1orf112 ENSG00000000460       FIRRM
#> ...                     ...        ...              ...         ...             ...         ...
#> ENSG00000273489          NA         NA               NA          NA              NA          NA
#> ENSG00000273490          NA         NA               NA          NA              NA          NA
#> ENSG00000273491          NA         NA               NA          NA              NA          NA
#> APP-DT                   NA         NA               NA          NA              NA          NA
#> ENSG00000273493          NA         NA               NA          NA              NA          NA
#>                     logFC   AveExpr         t     P.Value  adj.P.Val         B
#>                 <numeric> <numeric> <numeric>   <numeric>  <numeric> <numeric>
#> TSPAN6          -0.464216   5.02559 -6.589673 0.000136603 0.00171857  0.899306
#> TNMD                   NA        NA        NA          NA         NA        NA
#> DPM1             0.125077   4.60191  1.632802 0.139297605 0.25279527 -6.274792
#> SCYL3           -0.042107   3.47269 -0.438929 0.671768770 0.77787936 -7.230811
#> FIRRM           -0.228517   1.40857 -0.977961 0.355374953 0.49644090 -6.208897
#> ...                   ...       ...       ...         ...        ...       ...
#> ENSG00000273489        NA        NA        NA          NA         NA        NA
#> ENSG00000273490        NA        NA        NA          NA         NA        NA
#> ENSG00000273491        NA        NA        NA          NA         NA        NA
#> APP-DT                 NA        NA        NA          NA         NA        NA
#> ENSG00000273493        NA        NA        NA          NA         NA        NA

Live app

In this example, we use iSEE::panelDefaults() to specify rowData() fields to show in the tooltip that is displayed when hovering a data point.

The application is then configured to display the volcano plot and MA plot for the same contrast.

Finally, the configured app is launched.

library(iSEE)

panelDefaults(
    TooltipRowData = c("SYMBOL", "ENSEMBL")
)

app <- iSEE(airway, initial = list(
    VolcanoPlot(ContrastName = "dextrt - dexuntrt", PanelWidth = 6L),
    MAPlot(ContrastName = "dextrt - dexuntrt", PanelWidth = 6L)
))

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

Reproducibility

The iSEEde package (Rue-Albrecht, 2024) was made possible thanks to:

  • R (R Core Team, 2024)
  • BiocStyle (Oleś, 2024)
  • knitr (Xie, 2024)
  • RefManageR (McLean, 2017)
  • rmarkdown (Allaire, Xie, Dervieux, McPherson, Luraschi, Ushey, Atkins, Wickham, Cheng, Chang, and Iannone, 2024)
  • sessioninfo (Wickham, Chang, Flight, Müller, and Hester, 2021)
  • testthat (Wickham, 2011)

This package was developed using biocthis.

Code for creating the vignette

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

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

Date the vignette was generated.

#> [1] "2024-12-03 06:15:56 UTC"

Wallclock time spent generating the vignette.

#> Time difference of 12.613 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-12-03
#>  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)
#>  bibtex                 0.5.1    2023-01-26 [2] RSPM (R 4.4.0)
#>  Biobase              * 2.67.0   2024-11-30 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  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)
#>  BiocParallel           1.41.0   2024-11-29 [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)
#>  crayon                 1.5.3    2024-06-20 [2] RSPM (R 4.4.0)
#>  DBI                    1.2.3    2024-06-02 [2] RSPM (R 4.4.0)
#>  DelayedArray           0.33.3   2024-12-03 [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.1    2024-12-01 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  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)
#>  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-12-03 [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)
#>  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)
#>  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.2   2024-12-03 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  iSEE                 * 2.19.1   2024-12-03 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  iSEEde               * 1.5.0    2024-12-03 [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-11-29 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  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-12-03 [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)
#>  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)
#>  scales                 1.3.0    2023-11-28 [2] RSPM (R 4.4.0)
#>  scuttle              * 1.17.0   2024-11-30 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  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-11-30 [2] https://bioc.r-universe.dev (R 4.4.2)
#>  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)
#>  viridisLite            0.4.2    2023-05-02 [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/RtmpSHGeRW/Rinst1e612b039130
#>  [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. iSEEde: iSEE extension for panels related to differential expression analysis. R package version 1.5.0. 2024. URL: https://github.com/iSEE/iSEEde.

[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/.