SPICEY is an R package for quantifying cell-type specificity from
single-cell omics data. It supports inputs from common analysis
frameworks such as Seurat (for single-cell RNA-seq) and
Signac (for single-cell ATAC-seq), and provides a unified
interface for computing cell-type-specificity metrics at both the
regulatory and transcriptional levels.
SPICEY is designed to work with the results of differential analyses performed on single-cell ATAC-seq (to assess chromatin accessibility) or single-cell RNA-seq (to measure gene expression). These analyses typically compare features—either regulatory elements (e.g., peaks) or genes—across cell types to identify cell-type-specific activity or expression.
Rather than performing differential testing itself, SPICEY leverages pre-computed statistics from such analyses, specifically the log2 fold-change and associated adjusted p-values, which reflect both the magnitude and significance of cell-type enrichment. Using these inputs, SPICEY computes composite specificity scores that capture both the intensity and selectivity of differential signal across cell types.
In this tutorial, we illustrate the application of SPICEY on
single-cell datasets derived from non-diabetic human pancreatic islets
obtained through the Human Pancreas Analysis Program (HPAP) @ref. We analyzed paired single-nucleus ATAC-seq
and RNA-seq data from three donors with similar total cell counts and
comparable distributions of major pancreatic islet cell types. To
associate distal regulatory elements with their putative target genes,
we used co-accessibility links inferred via the Cicero
package.
Differential expression and accessibility analyses were conducted
using Seurat (FindMarkers()) function on both
RNA and ATAC assays. All genes and regions were considered
(logfc.threshold = 0), and the Wilcoxon Rank Sum
test was used (test.use = "wilcox"), following
Seurat default parameters.
SPICEY defines two complementary metrics to quantify cell-type specificity:
Both RETSI and GETSI are calculated using a weighted specificity score for each feature (regulatory region or gene), reflecting the level of enrichment in each cell type. These specificity indices are computed as follows:
\[ TSI_{i,x} = \frac{FC_{i,x}}{\max(FC)_x} \cdot w_{i} \]
\[ w_{i} = \text{rescale}\left( -\log_{10}(padj_{i}),\ [0, 1] \right) \]
where:
SPICEY offers two strategies for linking regulatory elements to their putative target genes:
These linking methods enable the integration of regulatory specificity (RETSI) and gene expression specificity (GETSI), facilitating the construction of detailed cell-type-specific regulatory networks from single-cell data.
Note: This vignette illustrates the use of SPICEY
with preprocessed GRanges inputs, which must be prepared
externally as they are not provided within the
package.
In addition to fold change–based metrics, SPICEY incorporates an entropy-based approach to quantify the distributional concentration or distributional skewness of feature activity across cell types using Shannon entropy.
For each feature \(x\) (e.g., gene or regulatory region), the activity or expression scores across \(N\) cell types are normalized into a probability distribution. This allows measuring how specific or broadly distributed a feature’s activity is across cell types. Lower entropy values indicate higher cell-type specificity, while higher entropy reflects more ubiquitous expression or accessibility. These entropy-based indices are computed as follows:
\[ H(x) = - \sum_{i=1}^{N} p_{i,x} \log_2(p_{i,x}) \]
\[ H_{\text{norm}}(x) = 1 - e^{-H(x)} \] where:
\[ p_{i,x} = \frac{s_{i,x}}{\sum_{j=1}^{N} s_{j,x}} \]
being:
This entropy framework provides a robust and interpretable measure of cell-type specificity that is complementary to fold change–based approaches.
Install the latest release of SPICEY from Bioconductor:
SPICEY requires preprocessed input files generated from differential analyses of single-cell omics data, specifically chromatin accessibility (ATAC-seq) and/or gene expression (RNA-seq). These inputs are not included in the package and must be prepared externally. Below is a detailed overview of the required input formats and metadata.
Accepted Formats:
GRanges objects or
data.frames (convertible to GRanges), where
each element contains differential accessibility results for a specific
cell type.GRangesList with each element representing a distinct
cell type.All inputs must be named with cell type identifiers.
Required Columns (per element):
region_id — Unique peak identifier matching the format
in your ATAC data (e.g., chr1-5000-5800 or
chr1:5000-5800).avg_log2FC — Average log2 fold-change of accessibility
in the given cell type.p_val_adj — Adjusted p-value from the differential
test.cell_type — Cell type or cluster label for each
measurement.Each peak should have multiple entries, one per cell type, allowing SPICEY to assess cell-type-specific accessibility patterns.
Accepted Formats:
GRanges objects or
data.frames (convertible to GRanges), with
each element containing differential expression results for a specific
cell type.GRangesList, where each element corresponds to a
distinct cell type.The list or GRangesList must be named
with cell type identifiers.
Required Columns (per element):
gene_id — Gene identifier column, consistent across all
entries, using official gene symbols (e.g.,
GAPDH).avg_log2FC — Average log2 fold-change in expression for
the gene within the specific cell type.p_val_adj — Adjusted p-value from the differential
test.cell_type — Cell type or cluster label associated with
the measurement.Each gene should have multiple entries—one per cell type—enabling SPICEY to evaluate expression specificity across cell populations.
Purpose:
Link regulatory elements to putative target genes based on
co-accessibility, typically derived from tools like Cicero.
This input is required only when using the annotation
parameter for RETSI/GETSI integration.
Format:
A data.frame containing co-accessibility pairs and their
scores.
Required Columns:
Peaks1 — Genomic coordinate or ID of the first peak in
the pair.Peaks2 — Genomic coordinate or ID of the second
peak.coaccess — Co-accessibility score or correlation value
between the paired peaks.Note: Peak identifiers in Peaks1 and
Peaks2 must exactly match those in the ATAC input,
including coordinate formatting (e.g., chr1:5000-6000
vs. chr1-5000-6000). Inconsistent formats will disrupt
accurate annotation.
data("cicero_links")
head(cicero_links)
#> Peak1 Peak2 coaccess
#> 1 chr1-110209621-110211746 chr1-110211947-110212475 0.6000726
#> 2 chr1-110211947-110212475 chr1-110209621-110211746 0.6000726
#> 3 chr1-119541413-119543141 chr1-119552715-119554580 0.6251863
#> 4 chr1-119552715-119554580 chr1-119541413-119543141 0.6251863
#> 5 chr1-167654711-167655798 chr1-167683611-167684550 0.8876609
#> 6 chr1-167661501-167662210 chr1-167683611-167684550 0.6807298SPICEY offers a comprehensive main function, SPICEY(),
which streamlines the entire workflow into a single, reproducible
process. It also includes optional helper functions for region-to-gene
annotation using different strategies:
annotate_with_coaccessibility() and
annotate_with_nearest().
When supplied with differential chromatin accessibility (ATAC) and/or
gene expression (RNA) data from single-cell experiments, along with a
chosen region-to-gene mapping method (“nearest” or “coaccessibility”),
the SPICEY() function performs the following:
The output is a structured list containing all intermediate and final results, facilitating downstream analysis and reuse.
# Load necessary packages
library(dplyr)
library(GenomicRanges)
library(TxDb.Hsapiens.UCSC.hg38.knownGene)
library(org.Hs.eg.db)
library(SPICEY)
data(atac)
data(rna)
data(cicero_links)
# Annotate peaks to genes with coaccessibility
peaks <- unique(unlist(atac)[, c("region_id")])
annotation_coacc <- annotate_with_coaccessibility(
peaks = peaks,
txdb = TxDb.Hsapiens.UCSC.hg38.knownGene,
links_df = cicero_links,
annot_dbi = org.Hs.eg.db,
protein_coding_only = TRUE,
verbose = TRUE,
add_tss_annotation = FALSE,
upstream = 2000,
downstream = 2000
)
# Calculate SPICEY measures and link them with coaccessibility
spicey_coacc <- SPICEY(
rna = rna,
atac = atac,
annotation = annotation_coacc
)
# Plot results
spicey_heatmap(spicey_coacc$linked,
spicey_measure = "SPICEY",
combined_score = TRUE
)This section outlines how to execute SPICEY using preprocessed input files, as detailed previously.
To calculate the Regulatory Element Tissue Specificity Index (RETSI), the following inputs are required:
atac: A named list of
GRanges objects or data.frames (convertible to
GRanges), each representing differential accessibility
results for a distinct cell type.SPICEY returns a data.frame combining the input
differential accessibility data with RETSI scores for each regulatory
region.
Note: Confirm that your inputs comply with the format outlined in the Input Requirements section prior to execution.
retsi <- SPICEY(atac = atac)
head(retsi)
#> cell_type p_val_adj p_val avg_log2FC region_id
#> 1 Acinar 3.353304e-302 0.000000e+00 6.025791 chr7-142748901-142749963
#> 2 Acinar 3.353304e-302 0.000000e+00 6.160286 chr2-79119834-79120951
#> 3 Acinar 3.353304e-302 0.000000e+00 6.299025 chr10-116587488-116588562
#> 4 Acinar 3.353304e-302 0.000000e+00 6.849885 chr10-116553223-116553959
#> 5 Acinar 4.272632e-232 9.160344e-238 6.694460 chr10-116589603-116590250
#> 6 Acinar 4.123107e-214 8.839769e-220 5.184217 chr16-75217280-75217880
#> RETSI RETSI_entropy
#> 1 1.0000000 0.0524689042
#> 2 1.0000000 0.0020261572
#> 3 1.0000000 0.0005612349
#> 4 1.0000000 0.0002746290
#> 5 0.7674589 0.0001781440
#> 6 0.7078037 0.0013891926To calculate the Gene Expression Tissue Specificity Index (GETSI), the following inputs are required:
rna: A named list of
GRanges objects or data.frames (convertible to
GRanges), each containing differential gene expression
results for a specific cell type.SPICEY outputs a data.frame that integrates the input
differential expression data with computed GETSI scores for each
gene.
Note: Verify that your inputs adhere to the format described in the Input Requirements section before execution.
getsi <- SPICEY(rna = rna)
head(getsi)
#> gene_id p_val avg_log2FC pct.1 pct.2 p_val_adj cell_type
#> 1 REG1A 0.000000e+00 6.446878 0.392 0.012 1.053548e-303 Acinar
#> 2 PRSS1 3.793351e-218 5.111544 0.608 0.067 7.442554e-214 Acinar
#> 3 PNLIP 5.687535e-208 5.156786 0.471 0.038 1.115894e-203 Acinar
#> 4 PRSS2 1.241892e-185 4.545974 0.568 0.066 2.436593e-181 Acinar
#> 5 REG1B 9.599031e-101 4.519686 0.176 0.010 1.883330e-96 Acinar
#> 6 PLCB4 5.936709e-84 -2.027707 0.458 0.933 1.164782e-79 Acinar
#> GETSI GETSI_entropy
#> 1 1.00000000 0.001229388
#> 2 0.70344625 0.104333983
#> 3 0.66985991 0.006319652
#> 4 0.59612780 0.432573280
#> 5 0.31594796 0.000000000
#> 6 0.05136069 0.700016953SPICEY offers an integrated approach to quantify tissue specificity at both the epigenetic and transcriptional levels by simultaneously computing Regulatory Element Tissue Specificity Indices (RETSI) and Gene Expression Tissue Specificity Indices (GETSI) from single-cell data.
By supplying both atac and rna inputs
together to the SPICEY() function, the tool calculates
RETSI and GETSI scores and returns a list with each specificity measure
provided separately.
spicey <- SPICEY(
atac = atac,
rna = rna
)
lapply(spicey, head)
#> $RETSI
#> cell_type p_val_adj p_val avg_log2FC region_id
#> 1 Acinar 3.353304e-302 0.000000e+00 6.025791 chr7-142748901-142749963
#> 2 Acinar 3.353304e-302 0.000000e+00 6.160286 chr2-79119834-79120951
#> 3 Acinar 3.353304e-302 0.000000e+00 6.299025 chr10-116587488-116588562
#> 4 Acinar 3.353304e-302 0.000000e+00 6.849885 chr10-116553223-116553959
#> 5 Acinar 4.272632e-232 9.160344e-238 6.694460 chr10-116589603-116590250
#> 6 Acinar 4.123107e-214 8.839769e-220 5.184217 chr16-75217280-75217880
#> RETSI RETSI_entropy
#> 1 1.0000000 0.0524689042
#> 2 1.0000000 0.0020261572
#> 3 1.0000000 0.0005612349
#> 4 1.0000000 0.0002746290
#> 5 0.7674589 0.0001781440
#> 6 0.7078037 0.0013891926
#>
#> $GETSI
#> gene_id p_val avg_log2FC pct.1 pct.2 p_val_adj cell_type
#> 1 REG1A 0.000000e+00 6.446878 0.392 0.012 1.053548e-303 Acinar
#> 2 PRSS1 3.793351e-218 5.111544 0.608 0.067 7.442554e-214 Acinar
#> 3 PNLIP 5.687535e-208 5.156786 0.471 0.038 1.115894e-203 Acinar
#> 4 PRSS2 1.241892e-185 4.545974 0.568 0.066 2.436593e-181 Acinar
#> 5 REG1B 9.599031e-101 4.519686 0.176 0.010 1.883330e-96 Acinar
#> 6 PLCB4 5.936709e-84 -2.027707 0.458 0.933 1.164782e-79 Acinar
#> GETSI GETSI_entropy
#> 1 1.00000000 0.001229388
#> 2 0.70344625 0.104333983
#> 3 0.66985991 0.006319652
#> 4 0.59612780 0.432573280
#> 5 0.31594796 0.000000000
#> 6 0.05136069 0.700016953SPICEY facilitates the construction of tissue-specific regulatory networks by integrating RETSI and GETSI scores through the association of regulatory elements with their putative target genes. This linkage connects each regulatory region’s cell type-specific RETSI score to the corresponding gene’s GETSI score, enabling comprehensive downstream network analyses.
To establish these links, regulatory regions must be annotated to target genes. SPICEY supports two annotation strategies:
Cicero).This method links each regulatory region to its closest gene TSS.
peaks: A GRanges object or
data.frame containing peaks to annotate, including these
columns:
seqnames: Chromosome name (e.g., chr1)start: Peak start coordinateend: Peak end coordinateregion_id: Unique region identifier in genomic
coordinate format (e.g., chr1-5000-5800 or
chr1:5000-5800)txdb: A TxDb object for genome annotation
(e.g., TxDb.Hsapiens.UCSC.hg38.knownGene).annot_dbi: An AnnotationDbi object for
gene metadata (e.g., org.Hs.eg.db).upstream: Number of bases upstream from the TSS to
consider (default: 2000).downstream: Number of bases downstream from the TSS to
consider (default: 2000).protein_coding_only: Limit annotations to
protein-coding genes (default: TRUE).add_tss_annotation: Annotate regulatory elements
overlapping the TSS (default: FALSE). If enabled, uses ±1
bp around TSS instead of ±2000 bp.verbose: Display progress messages (default:
TRUE).peaks <- unique(unlist(atac)[, c("region_id")])
annotation_near <- annotate_with_nearest(
peaks = peaks,
txdb = TxDb.Hsapiens.UCSC.hg38.knownGene,
annot_dbi = org.Hs.eg.db,
protein_coding_only = TRUE,
verbose = TRUE,
add_tss_annotation = FALSE,
upstream = 2000,
downstream = 2000
)
head(annotation_near)
#> region_id distanceToTSS gene_id
#> chr7-142748901-142749963 chr7-142748901-142749963 25424083 WNT2
#> chr2-79119834-79120951 chr2-79119834-79120951 0 REG1A
#> chr10-116587488-116588562 chr10-116587488-116588562 15524492 KAZALD1
#> chr10-116553223-116553959 chr10-116553223-116553959 15490227 KAZALD1
#> chr10-116589603-116590250 chr10-116589603-116590250 15526607 KAZALD1
#> chr16-75217280-75217880 chr16-75217280-75217880 8850526 CDH5
#> annotation
#> chr7-142748901-142749963 Distal
#> chr2-79119834-79120951 Promoter
#> chr10-116587488-116588562 Distal
#> chr10-116553223-116553959 Distal
#> chr10-116589603-116590250 Distal
#> chr16-75217280-75217880 DistalThis function returns a data frame linking each regulatory region to its nearest gene based on genomic proximity.
This method connects regulatory regions to genes through co-accessibility interactions, which must be computed externally (e.g., using Cicero).
peaks: A GRanges object or
data.frame of peaks to annotate, including the following
columns:
seqnames: Chromosome name (e.g., chr1)start: Peak start coordinateend: Peak end coordinateregion_id: Unique region identifier in genomic
coordinate format (e.g., chr1-5000-5800 or
chr1:5000-5800)txdb: A TxDb object for genome annotation
(e.g., TxDb.Hsapiens.UCSC.hg38.knownGene).annot_dbi: An AnnotationDbi object for
gene metadata (e.g., org.Hs.eg.db).links_df: A data.frame containing
co-accessibility links or scores (e.g., from Cicero), with these
required columns:
Peaks1: Genomic coordinate or ID of the first peak in
the pairPeaks2: Genomic coordinate or ID of the second peak
linked by co-accessibilitycoaccess: Co-accessibility score or correlation value
between peaksupstream: Number of bases upstream from the TSS to
consider (default: 2000).downstream: Number of bases downstream from the TSS to
consider (default: 2000).protein_coding_only: Limit annotations to
protein-coding genes (default: TRUE).add_tss_annotation: Annotate regulatory elements
overlapping the TSS (default: FALSE). If enabled, uses ±1
bp around TSS instead of ±2000 bp.verbose: Display progress messages (default:
TRUE).peaks <- unique(unlist(atac)[, c("region_id")])
annotation_coacc <- annotate_with_coaccessibility(
peaks = peaks,
txdb = TxDb.Hsapiens.UCSC.hg38.knownGene,
links_df = cicero_links,
annot_dbi = org.Hs.eg.db,
protein_coding_only = TRUE,
verbose = TRUE,
add_tss_annotation = FALSE,
upstream = 2000,
downstream = 2000
)
head(annotation_coacc)
#> region_id gene_id
#> 1 chr1-110209621-110211746 KCNC4
#> 2 chr1-20290295-20292065 UBXN10
#> 3 chr1-20290295-20292065 PLA2G2C
#> 4 chr11-102177735-102178851 YAP1
#> 5 chr11-102551894-102553101 BIRC3
#> 6 chr11-102551894-102553101 MMP7This function returns a data frame linking each regulatory region to its associated gene based on co-accessibility relationships.
The annotation step(s) are optional. Users can
either generate these annotations using SPICEY’s built-in functions or
supply a pre-computed data.frame of gene–region
associations. When using pre-computed data to construct tissue-specific
regulatory networks, the data.frame must include at minimum
the following columns:
region_id: Unique identifier for each region, ideally
following standard genomic coordinate formats such as
chr-start-end (e.g., chr1-5000-5800) or
chr:start-end (e.g., chr1:5000-5800). It should be
the same being provided to SPICEY as
region_id.gene_id: Unique gene identifier. It should be the same
being provided to SPICEY as gene_id.With the annotation linking regulatory elements to their target genes (via TSS proximity or co-accessibility), SPICEY enables integration of RETSI and GETSI scores. This links each regulatory region’s cell type-specific RETSI score with its target gene’s corresponding GETSI score, facilitating the construction of detailed tissue-specific regulatory networks.
This approach supports comprehensive analysis of regulatory mechanisms at both epigenetic and transcriptional levels.
# Using nearest gene annotation data
spicey_near <- SPICEY(
rna = rna,
atac = atac,
annotation = annotation_near
)
# Using co-accessibility gene annotation data
spicey_coacc <- SPICEY(
rna = rna,
atac = atac,
annotation = annotation_coacc
)This function returns a list containing separately computed RETSI and GETSI scores, along with an additional element that links these measures based on the selected region-to-gene annotation method.
The primary output is a data.frame or a list of
data.frames representing genomic regions (e.g., enhancers
or promoters), each annotated with rich metadata derived from chromatin
accessibility and gene expression data. Key columns include:
| Column | Description |
|---|---|
cell_type |
Cell type exhibiting significant accessibility or expression (e.g.,
"Acinar"). |
p_val_adj |
Adjusted p-value from differential testing, controlling for multiple comparisons. |
avg_log2FC |
Average log2 fold-change of accessibility/expression in the specified cell type vs others. |
region_id |
Genomic interval identifier (e.g.,
"chr7:142748901-142749963"). |
RETSI |
Regulatory Element Tissue Specificity Index; values near 1 indicate high cell-type specificity. |
RETSI_entropy |
Entropy-based specificity metric; lower values indicate greater cell-type specificity. |
gene_id or nearestGeneSymbol |
Gene identifier (official gene symbol). |
GETSI |
Gene Expression Tissue Specificity Index for linked genes, indicating expression specificity. |
GETSI_entropy |
Entropy-based specificity metric for gene expression, analogous to
RETSI_entropy. |
| Column | Description |
|---|---|
cell_type |
Cell type showing significant accessibility (e.g.,
"Acinar"). |
p_val_adj_ATAC |
Adjusted p-value from differential accessibility testing. |
avg_log2FC_ATAC |
Average log2 fold-change in accessibility for the cell type versus others. |
region_id |
Genomic interval identifier (e.g.,
"chr7:142748901-142749963"). |
RETSI |
Regulatory Element Tissue Specificity Index. |
RETSI_entropy |
Entropy-based specificity measure for accessibility. |
gene_id or nearestGeneSymbol |
Gene identifier (official gene symbol). |
p_val_adj_RNA |
Adjusted p-value from differential expression testing. |
avg_log2FC_RNA |
Average log2 fold-change in gene expression for the cell type versus others. |
pct.1 |
Percentage of cells expressing the gene in the first group of the differential analysis. |
pct.2 |
Percentage of cells expressing the gene in the second group. |
GETSI |
Gene Expression Tissue Specificity Index for linked genes. |
GETSI_entropy |
Entropy-based specificity metric for gene expression. |
This annotated data.frame serves as a comprehensive
resource combining genomic coordinates, cell type-specific regulatory
activity, gene associations, and expression specificity—enabling
advanced functional genomics analyses.
The SPICEY package provides a flexible function for
visualizing gene-regulatory-level specificity across cell types using
the spicey_heatmap() function. This function supports
visualizing:
These visualizations help uncover transcriptional and regulatory programs that are specific to individual cell types and can assist in identifying marker genes or highly specific regulatory programs.
The spicey_heatmap() function performs the following
steps:
RETSI,
GETSI, or a combined SPICEY score).n genes based on their SPICEY score ranks.Depending on the spicey_measure and
combined_score arguments, the function adapts the
output:
spicey_measure = "RETSI": Plots scored RETSI values,
where RETSI reflects cell-type-specific accessibility of regulatory
regions linked to genes.spicey_measure = "GETSI": Plots scored GETSI values
based on gene expression.spicey_measure = "SPICEY" and
combined_score = FALSE: Displays two separate heatmaps -one
for RETSI, one for GETSI - enabling side-by-side comparison.spicey_measure = "SPICEY" and
combined_score = TRUE: RETSI and GETSI are independently
scored and averaged per gene-cell-type pair. A single unified heatmap is
generated to highlight shared specificity across both data types.To run spicey_heatmap(), the input must be a
data.frame with the following columns:
gene_id:
cell_type: Cell type or cluster label (e.g.,
"Acinar").GETSI and/or RETSI score.df: A data.frame containing the columns
described above.top_n: Number of top-ranked genes to retain per cell
type (default: 5).spicey_measure: Score type to visualize. Must be one of
"RETSI", "GETSI", or
"SPICEY".combined_score: Logical. If TRUE and
spicey_measure = "SPICEY", computes a combined mean score
across RETSI and GETSI (default: FALSE).
# If only RETSI is calculated (only ATAC data available), join with coaccessibility or nearest gene annotation to show gene_id in the plots
retsi <- spicey_coacc$RETSI
retsi <- retsi |> left_join(annotation_near, by = c("region_id"))
spicey_heatmap(retsi,
spicey_measure = "RETSI"
)# SPICEY: combined average RETSI and GETSI scores
spicey_heatmap(spicey_coacc$linked,
spicey_measure = "SPICEY",
combined_score = TRUE
)sessionInfo()
#> R version 4.5.1 (2025-06-13)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.3 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=C
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats4 stats graphics grDevices utils datasets methods
#> [8] base
#>
#> other attached packages:
#> [1] org.Hs.eg.db_3.22.0
#> [2] TxDb.Hsapiens.UCSC.hg38.knownGene_3.22.0
#> [3] GenomicFeatures_1.63.1
#> [4] AnnotationDbi_1.71.2
#> [5] Biobase_2.69.1
#> [6] GenomicRanges_1.63.0
#> [7] Seqinfo_1.1.0
#> [8] IRanges_2.45.0
#> [9] S4Vectors_0.49.0
#> [10] BiocGenerics_0.55.4
#> [11] generics_0.1.4
#> [12] dplyr_1.1.4
#> [13] SPICEY_1.1.0
#> [14] BiocStyle_2.37.1
#>
#> loaded via a namespace (and not attached):
#> [1] tidyselect_1.2.1 farver_2.1.2
#> [3] blob_1.2.4 Biostrings_2.77.2
#> [5] S7_0.2.0 bitops_1.0-9
#> [7] fastmap_1.2.0 RCurl_1.98-1.17
#> [9] GenomicAlignments_1.47.0 XML_3.99-0.19
#> [11] digest_0.6.37 lifecycle_1.0.4
#> [13] KEGGREST_1.49.2 RSQLite_2.4.3
#> [15] magrittr_2.0.4 compiler_4.5.1
#> [17] rlang_1.1.6 sass_0.4.10
#> [19] tools_4.5.1 yaml_2.3.10
#> [21] rtracklayer_1.69.1 knitr_1.50
#> [23] labeling_0.4.3 S4Arrays_1.11.0
#> [25] bit_4.6.0 curl_7.0.0
#> [27] DelayedArray_0.37.0 RColorBrewer_1.1-3
#> [29] abind_1.4-8 BiocParallel_1.43.4
#> [31] withr_3.0.2 purrr_1.1.0
#> [33] sys_3.4.3 grid_4.5.1
#> [35] ggplot2_4.0.0 scales_1.4.0
#> [37] SummarizedExperiment_1.39.2 cli_3.6.5
#> [39] rmarkdown_2.30 crayon_1.5.3
#> [41] httr_1.4.7 rjson_0.2.23
#> [43] DBI_1.2.3 cachem_1.1.0
#> [45] parallel_4.5.1 BiocManager_1.30.26
#> [47] XVector_0.49.3 restfulr_0.0.16
#> [49] matrixStats_1.5.0 vctrs_0.6.5
#> [51] Matrix_1.7-4 jsonlite_2.0.0
#> [53] bit64_4.6.0-1 maketools_1.3.2
#> [55] jquerylib_0.1.4 tidyr_1.3.1
#> [57] glue_1.8.0 codetools_0.2-20
#> [59] cowplot_1.2.0 gtable_0.3.6
#> [61] GenomeInfoDb_1.47.0 BiocIO_1.19.0
#> [63] UCSC.utils_1.5.1 tibble_3.3.0
#> [65] pillar_1.11.1 htmltools_0.5.8.1
#> [67] R6_2.6.1 evaluate_1.0.5
#> [69] lattice_0.22-7 png_0.1-8
#> [71] Rsamtools_2.25.3 cigarillo_1.1.0
#> [73] memoise_2.0.1 bslib_0.9.0
#> [75] SparseArray_1.11.0 xfun_0.53
#> [77] MatrixGenerics_1.21.0 buildtools_1.0.0
#> [79] pkgconfig_2.0.3