# load the necessary libraries
library(SPAROscore)
library(airway)
library(msigdbr)
library(dplyr)
library(Matrix)
library(DelayedArray)
library(GSEABase)
library(Seurat)
library(scater)SPAROscore is designed to integrate seamlessly with data structures commonly used in bulk, single-cell, and spatial RNA-seq analysis workflows. Rather than requiring users to convert their data into a specific format, SPAROscore accepts a range of gene expression and gene signature data structures. This vignette demonstrates the supported input formats and illustrates how the output adapts to each input type.
For gene expression input, the following data structures are supported
Matrix-like objects: Dense matrices, Sparse Matrices, Delayed Arrays, and Data frames
Bioconductor data structures: SummarizedExperiment and its derived classes like SingleCellExperiment, SpatialExperiment, RangedSummarizedExperiment, tidySummarizedExperiment, etc.
Seurat objects: containing both single-cell and spatial datasets
Note: Matrix-like inputs return a score table, whereas container objects (e.g. SummarizedExperiment and Seurat) are returned with scores added to their metadata.
| Input | Accepted | Output |
|---|---|---|
| matrix | ✓ | matrix |
| sparseMatrix | ✓ | matrix |
| DelayedArray | ✓ | matrix |
| data.frame | ✓ | matrix |
| SummarizedExperiment | ✓ | SummarizedExperiment |
| SingleCellExperiment | ✓ | SingleCellExperiment |
| SpatialExperiment | ✓ | SpatialExperiment |
| Seurat | ✓ | Seurat |
For the gene signature input, the following formats are supported
For a single signature: A character vector, A GeneSet object
For multiple signatures: A named list of character vectors, GeneSetCollection objects.
Note: The Gene identifiers (gene names, ensembl ids, etc) in the signature must match those used in the expression data.
In this vignette, we will demonstrate the data structure handling
capabilities of SPAROscore using the example dataset from the
airway package. For the gene signatures, we will use the
top differentially expressed genes reported in the original study,
as well as the hallmark inflammatory response genes taken from the
Molecular Signatures Database (MSigDB).
# set the glucocorticoid response markers from the original study as a signature
response_genes <- c("ENSG00000112936", "ENSG00000170606", "ENSG00000120129",
"ENSG00000152795", "ENSG00000211445", "ENSG00000163884",
"ENSG00000189221", "ENSG00000101347", "ENSG00000196136",
"ENSG00000152583", "ENSG00000120658", "ENSG00000157514",
"ENSG00000103196", "ENSG00000179094", "ENSG00000152763",
"ENSG00000103310", "ENSG00000127954")
# load the inflammatory response hallmark genes from msigdb
inflammation_genes <- msigdbr(species = "Homo sapiens", collection = "H") %>%
filter(gs_name == "HALLMARK_INFLAMMATORY_RESPONSE") %>%
pull("ensembl_gene") %>%
as.character()# load gene expression data as dense matrix
counts_matrix <- as.matrix(counts_data)
# score for the dense matrix
scores_matrix <- sparoscore(data = counts_matrix,
signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_matrix
#> SPAROscore
#> SRR1039508 0.3890656
#> SRR1039509 0.3769621
#> SRR1039512 0.3879705
#> SRR1039513 0.3645041
#> SRR1039516 0.3881300
#> SRR1039517 0.4005423
#> SRR1039520 0.3873233
#> SRR1039521 0.3836297Note that one signature gene is absent from the input expression data, and SPAROscore reports this as a warning during scoring.
# load gene expression data as sparseMatrix
counts_sparse <- as(counts_matrix, "sparseMatrix")
# score for the sparseMatrix
scores_sparse <- sparoscore(data = counts_sparse,
signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_sparse
#> SPAROscore
#> SRR1039508 0.3890656
#> SRR1039509 0.3769621
#> SRR1039512 0.3879705
#> SRR1039513 0.3645041
#> SRR1039516 0.3881300
#> SRR1039517 0.4005423
#> SRR1039520 0.3873233
#> SRR1039521 0.3836297Gene ranking is performed directly on sparse matrices without first converting them to dense matrices, reducing memory usage and improving computational efficiency.
# load gene expression data as delayedArray
counts_delayed <- DelayedArray(counts_matrix)
# score for the DelayedArray
scores_delayed <- sparoscore(data = counts_delayed,
signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a DelayedMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_delayed
#> SPAROscore
#> SRR1039508 0.3890656
#> SRR1039509 0.3769621
#> SRR1039512 0.3879705
#> SRR1039513 0.3645041
#> SRR1039516 0.3881300
#> SRR1039517 0.4005423
#> SRR1039520 0.3873233
#> SRR1039521 0.3836297Note that the gene ranking is performed natively on the DelayedArray object, enabling improved computational efficiency.
# load gene expression data as delayedArray
counts_df <- as.data.frame(counts_matrix)
# score for the DelayedArray
scores_df <- sparoscore(data = counts_df,
signatures = inflammation_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_df
#> SPAROscore
#> SRR1039508 0.3890656
#> SRR1039509 0.3769621
#> SRR1039512 0.3879705
#> SRR1039513 0.3645041
#> SRR1039516 0.3881300
#> SRR1039517 0.4005423
#> SRR1039520 0.3873233
#> SRR1039521 0.3836297Data frames are internally converted to matrices before ranking because matrix operations are more efficient for this step.
# compute scores from a character vector signature
scores_for_vector <- sparoscore(data = counts_matrix,
signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
# view scores
scores_for_vector
#> SPAROscore
#> SRR1039508 0.5238153
#> SRR1039509 0.7654385
#> SRR1039512 0.5495932
#> SRR1039513 0.7473585
#> SRR1039516 0.5337068
#> SRR1039517 0.7162212
#> SRR1039520 0.5222398
#> SRR1039521 0.7593574# get a GeneSet object
response_geneset <- GeneSet(response_genes)
# compute scores from a GeneSet object
scores_for_geneset <- sparoscore(data = counts_sparse,
signatures = response_geneset,
prefix = "hello")
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
# view scores
scores_for_geneset
#> helloNA
#> SRR1039508 0.5238153
#> SRR1039509 0.7654385
#> SRR1039512 0.5495932
#> SRR1039513 0.7473585
#> SRR1039516 0.5337068
#> SRR1039517 0.7162212
#> SRR1039520 0.5222398
#> SRR1039521 0.7593574# create a named list of vectors to score for both signatures simultaneously
gene_signatures <- list("glucocorticoid_response" = response_genes,
"inflammation_response" = inflammation_genes)
# compute scores from a list of signatures
scores_for_list <- sparoscore(data = counts_sparse,
signatures = gene_signatures)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_for_list
#> glucocorticoid_response inflammation_response
#> SRR1039508 0.5238153 0.3890656
#> SRR1039509 0.7654385 0.3769621
#> SRR1039512 0.5495932 0.3879705
#> SRR1039513 0.7473585 0.3645041
#> SRR1039516 0.5337068 0.3881300
#> SRR1039517 0.7162212 0.4005423
#> SRR1039520 0.5222398 0.3873233
#> SRR1039521 0.7593574 0.3836297# create a GeneSetCollection object to score for both signatures simultaneously
gene_set_collection <- GeneSetCollection(
mapply(function(g, n) GeneSet(unique(g), setName = n),
gene_signatures, names(gene_signatures))
)
# compute scores from a GeneSetCollection object
scores_for_gsc <- sparoscore(data = counts_matrix,
signatures = gene_set_collection)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view scores
scores_for_gsc
#> glucocorticoid_response inflammation_response
#> SRR1039508 0.5238153 0.3890656
#> SRR1039509 0.7654385 0.3769621
#> SRR1039512 0.5495932 0.3879705
#> SRR1039513 0.7473585 0.3645041
#> SRR1039516 0.5337068 0.3881300
#> SRR1039517 0.7162212 0.4005423
#> SRR1039520 0.5222398 0.3873233
#> SRR1039521 0.7593574 0.3836297For SummarizedExperiment and its derived objects, after scoring,
SPAROscore returns an object of the same class with the scores and the
rank caps appended to the colData. The calculated gene
ranks are added to a new assay named ranks.
In this example, let us work with a SingleCellExperiment object
# convert airways to a SingleCellExperiment object
airway_sce <- as(airway, "SingleCellExperiment")
# view the metadata of the object pre-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 9 columns
#> SampleName cell dex albut Run avgLength
#> <factor> <factor> <factor> <factor> <factor> <integer>
#> SRR1039508 GSM1275862 N61311 untrt untrt SRR1039508 126
#> SRR1039509 GSM1275863 N61311 trt untrt SRR1039509 126
#> SRR1039512 GSM1275866 N052611 untrt untrt SRR1039512 126
#> SRR1039513 GSM1275867 N052611 trt untrt SRR1039513 87
#> SRR1039516 GSM1275870 N080611 untrt untrt SRR1039516 120
#> SRR1039517 GSM1275871 N080611 trt untrt SRR1039517 126
#> SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520 101
#> SRR1039521 GSM1275875 N061011 trt untrt SRR1039521 98
#> Experiment Sample BioSample
#> <factor> <factor> <factor>
#> SRR1039508 SRX384345 SRS508568 SAMN02422669
#> SRR1039509 SRX384346 SRS508567 SAMN02422675
#> SRR1039512 SRX384349 SRS508571 SAMN02422678
#> SRR1039513 SRX384350 SRS508572 SAMN02422670
#> SRR1039516 SRX384353 SRS508575 SAMN02422682
#> SRR1039517 SRX384354 SRS508576 SAMN02422673
#> SRR1039520 SRX384357 SRS508579 SAMN02422683
#> SRR1039521 SRX384358 SRS508580 SAMN02422677
# view the assays present in the object pre-scoring
assays(airway_sce)
#> List of length 1
#> names(1): counts
# compute scores for a SummarizedExperiment object
airway_sce <- sparoscore(data = airway_sce,
assay = "counts",
signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a matrix object
# view the metadata of the object after-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 11 columns
#> SampleName cell dex albut Run avgLength
#> <factor> <factor> <factor> <factor> <factor> <integer>
#> SRR1039508 GSM1275862 N61311 untrt untrt SRR1039508 126
#> SRR1039509 GSM1275863 N61311 trt untrt SRR1039509 126
#> SRR1039512 GSM1275866 N052611 untrt untrt SRR1039512 126
#> SRR1039513 GSM1275867 N052611 trt untrt SRR1039513 87
#> SRR1039516 GSM1275870 N080611 untrt untrt SRR1039516 120
#> SRR1039517 GSM1275871 N080611 trt untrt SRR1039517 126
#> SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520 101
#> SRR1039521 GSM1275875 N061011 trt untrt SRR1039521 98
#> Experiment Sample BioSample rank_caps SPAROscore
#> <factor> <factor> <factor> <integer> <numeric>
#> SRR1039508 SRX384345 SRS508568 SAMN02422669 17909 0.523815
#> SRR1039509 SRX384346 SRS508567 SAMN02422675 17512 0.765439
#> SRR1039512 SRX384349 SRS508571 SAMN02422678 17955 0.549593
#> SRR1039513 SRX384350 SRS508572 SAMN02422670 16733 0.747358
#> SRR1039516 SRX384353 SRS508575 SAMN02422682 17841 0.533707
#> SRR1039517 SRX384354 SRS508576 SAMN02422673 18153 0.716221
#> SRR1039520 SRX384357 SRS508579 SAMN02422683 17807 0.522240
#> SRR1039521 SRX384358 SRS508580 SAMN02422677 17595 0.759357
# view the assays present in the object after-scoring
assays(airway_sce)
#> List of length 2
#> names(2): counts ranks
# the precomputed ranks can be reused for subsequent scoring runs
airway_sce <- sparoscore(data=airway_sce,
data_has_ranks = TRUE,
assay = "ranks",
signatures = inflammation_genes,
prefix = "run2_")
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view the metadata of the object after-scoring
colData(airway_sce)
#> DataFrame with 8 rows and 13 columns
#> SampleName cell dex albut Run avgLength
#> <factor> <factor> <factor> <factor> <factor> <integer>
#> SRR1039508 GSM1275862 N61311 untrt untrt SRR1039508 126
#> SRR1039509 GSM1275863 N61311 trt untrt SRR1039509 126
#> SRR1039512 GSM1275866 N052611 untrt untrt SRR1039512 126
#> SRR1039513 GSM1275867 N052611 trt untrt SRR1039513 87
#> SRR1039516 GSM1275870 N080611 untrt untrt SRR1039516 120
#> SRR1039517 GSM1275871 N080611 trt untrt SRR1039517 126
#> SRR1039520 GSM1275874 N061011 untrt untrt SRR1039520 101
#> SRR1039521 GSM1275875 N061011 trt untrt SRR1039521 98
#> Experiment Sample BioSample rank_caps SPAROscore rank_caps
#> <factor> <factor> <factor> <integer> <numeric> <numeric>
#> SRR1039508 SRX384345 SRS508568 SAMN02422669 17909 0.523815 17909
#> SRR1039509 SRX384346 SRS508567 SAMN02422675 17512 0.765439 17512
#> SRR1039512 SRX384349 SRS508571 SAMN02422678 17955 0.549593 17955
#> SRR1039513 SRX384350 SRS508572 SAMN02422670 16733 0.747358 16733
#> SRR1039516 SRX384353 SRS508575 SAMN02422682 17841 0.533707 17841
#> SRR1039517 SRX384354 SRS508576 SAMN02422673 18153 0.716221 18153
#> SRR1039520 SRX384357 SRS508579 SAMN02422683 17807 0.522240 17807
#> SRR1039521 SRX384358 SRS508580 SAMN02422677 17595 0.759357 17595
#> run2_SPAROscore
#> <numeric>
#> SRR1039508 0.389066
#> SRR1039509 0.376962
#> SRR1039512 0.387971
#> SRR1039513 0.364504
#> SRR1039516 0.388130
#> SRR1039517 0.400542
#> SRR1039520 0.387323
#> SRR1039521 0.383630For Seurat objects, after scoring, SPAROscore returns a Seurat object
with the scores and the rank caps appended to the metadata. The ranks
are stored in a layer named ranks in the same assay as the
counts.
# convert airway to a seurat object
airway_seurat <- CreateSeuratObject(
counts = assay(airway),
meta.data = as.data.frame(colData(airway)),
project = "Airway_Seurat"
)
#> Warning: Data is of class matrix. Coercing to dgCMatrix.
# view the metadata of the object pre-scoring
airway_seurat[[]]
#> orig.ident nCount_RNA nFeature_RNA SampleName cell dex albut
#> SRR1039508 Airway_Seurat 20637971 24633 GSM1275862 N61311 untrt untrt
#> SRR1039509 Airway_Seurat 18809481 24527 GSM1275863 N61311 trt untrt
#> SRR1039512 Airway_Seurat 25348649 25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat 15163415 23124 GSM1275867 N052611 trt untrt
#> SRR1039516 Airway_Seurat 24448408 25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat 30818215 25998 GSM1275871 N080611 trt untrt
#> SRR1039520 Airway_Seurat 19126151 24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat 21164133 23991 GSM1275875 N061011 trt untrt
#> Run avgLength Experiment Sample BioSample
#> SRR1039508 SRR1039508 126 SRX384345 SRS508568 SAMN02422669
#> SRR1039509 SRR1039509 126 SRX384346 SRS508567 SAMN02422675
#> SRR1039512 SRR1039512 126 SRX384349 SRS508571 SAMN02422678
#> SRR1039513 SRR1039513 87 SRX384350 SRS508572 SAMN02422670
#> SRR1039516 SRR1039516 120 SRX384353 SRS508575 SAMN02422682
#> SRR1039517 SRR1039517 126 SRX384354 SRS508576 SAMN02422673
#> SRR1039520 SRR1039520 101 SRX384357 SRS508579 SAMN02422683
#> SRR1039521 SRR1039521 98 SRX384358 SRS508580 SAMN02422677
# view all the layers in the object pre-scoring
Layers(airway_seurat[["RNA"]])
#> [1] "counts"
# compute scores for a Seurat object
airway_seurat <- sparoscore(data = airway_seurat,
assay = "RNA",
layer = "counts",
signatures = response_genes)
#> SPAROscore says: Calculating column-wise geometric averages
#> SPAROscore says: Ranking a sparseMatrix object
# view the metadata of the object after-scoring
airway_seurat[[]]
#> orig.ident nCount_RNA nFeature_RNA SampleName cell dex albut
#> SRR1039508 Airway_Seurat 20637971 24633 GSM1275862 N61311 untrt untrt
#> SRR1039509 Airway_Seurat 18809481 24527 GSM1275863 N61311 trt untrt
#> SRR1039512 Airway_Seurat 25348649 25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat 15163415 23124 GSM1275867 N052611 trt untrt
#> SRR1039516 Airway_Seurat 24448408 25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat 30818215 25998 GSM1275871 N080611 trt untrt
#> SRR1039520 Airway_Seurat 19126151 24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat 21164133 23991 GSM1275875 N061011 trt untrt
#> Run avgLength Experiment Sample BioSample rank_caps
#> SRR1039508 SRR1039508 126 SRX384345 SRS508568 SAMN02422669 17909
#> SRR1039509 SRR1039509 126 SRX384346 SRS508567 SAMN02422675 17512
#> SRR1039512 SRR1039512 126 SRX384349 SRS508571 SAMN02422678 17955
#> SRR1039513 SRR1039513 87 SRX384350 SRS508572 SAMN02422670 16733
#> SRR1039516 SRR1039516 120 SRX384353 SRS508575 SAMN02422682 17841
#> SRR1039517 SRR1039517 126 SRX384354 SRS508576 SAMN02422673 18153
#> SRR1039520 SRR1039520 101 SRX384357 SRS508579 SAMN02422683 17807
#> SRR1039521 SRR1039521 98 SRX384358 SRS508580 SAMN02422677 17595
#> SPAROscore
#> SRR1039508 0.5238153
#> SRR1039509 0.7654385
#> SRR1039512 0.5495932
#> SRR1039513 0.7473585
#> SRR1039516 0.5337068
#> SRR1039517 0.7162212
#> SRR1039520 0.5222398
#> SRR1039521 0.7593574
# view all the layers in the object after-scoring
Layers(airway_seurat[["RNA"]])
#> [1] "counts" "ranks"
# the precomputed ranks can be reused for subsequent scoring runs
airway_seurat <- sparoscore(data = airway_seurat,
data_has_ranks = TRUE,
assay = "RNA",
layer = "ranks",
signatures = inflammation_genes,
prefix = "run2_")
#> Warning: SPAROscore says: The following 1 signature genes are missing in the
#> input dataset: ENSG00000275163
# view the metadata of the object after-scoring
airway_seurat[[]]
#> orig.ident nCount_RNA nFeature_RNA SampleName cell dex albut
#> SRR1039508 Airway_Seurat 20637971 24633 GSM1275862 N61311 untrt untrt
#> SRR1039509 Airway_Seurat 18809481 24527 GSM1275863 N61311 trt untrt
#> SRR1039512 Airway_Seurat 25348649 25699 GSM1275866 N052611 untrt untrt
#> SRR1039513 Airway_Seurat 15163415 23124 GSM1275867 N052611 trt untrt
#> SRR1039516 Airway_Seurat 24448408 25508 GSM1275870 N080611 untrt untrt
#> SRR1039517 Airway_Seurat 30818215 25998 GSM1275871 N080611 trt untrt
#> SRR1039520 Airway_Seurat 19126151 24662 GSM1275874 N061011 untrt untrt
#> SRR1039521 Airway_Seurat 21164133 23991 GSM1275875 N061011 trt untrt
#> Run avgLength Experiment Sample BioSample rank_caps
#> SRR1039508 SRR1039508 126 SRX384345 SRS508568 SAMN02422669 17909
#> SRR1039509 SRR1039509 126 SRX384346 SRS508567 SAMN02422675 17512
#> SRR1039512 SRR1039512 126 SRX384349 SRS508571 SAMN02422678 17955
#> SRR1039513 SRR1039513 87 SRX384350 SRS508572 SAMN02422670 16733
#> SRR1039516 SRR1039516 120 SRX384353 SRS508575 SAMN02422682 17841
#> SRR1039517 SRR1039517 126 SRX384354 SRS508576 SAMN02422673 18153
#> SRR1039520 SRR1039520 101 SRX384357 SRS508579 SAMN02422683 17807
#> SRR1039521 SRR1039521 98 SRX384358 SRS508580 SAMN02422677 17595
#> SPAROscore run2_SPAROscore
#> SRR1039508 0.5238153 0.3890656
#> SRR1039509 0.7654385 0.3769621
#> SRR1039512 0.5495932 0.3879705
#> SRR1039513 0.7473585 0.3645041
#> SRR1039516 0.5337068 0.3881300
#> SRR1039517 0.7162212 0.4005423
#> SRR1039520 0.5222398 0.3873233
#> SRR1039521 0.7593574 0.3836297This vignette demonstrated the range of expression data containers and gene signature representations accepted by SPAROscore. Matrix-like inputs return score tables, while container objects such as SummarizedExperiment and Seurat are returned with scores and precomputed ranks integrated into the original object. This design allows SPAROscore to fit naturally into existing bulk RNA-seq, ingle-cell RNA-seq, and spatial transcriptomics workflows with minimal data conversion.
For examples of in-depth transcriptomics analyses using SPAROscore, refer here: Transcriptomics technologies
For examples of additional options and advanced usage, see: Advanced options
sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04 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.32.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=en_US.UTF-8
#> [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] scater_1.41.2 ggplot2_4.0.3
#> [3] scuttle_1.23.1 SingleCellExperiment_1.35.2
#> [5] Seurat_5.5.1 SeuratObject_5.4.0
#> [7] sp_2.2-3 GSEABase_1.75.0
#> [9] graph_1.91.0 annotate_1.91.0
#> [11] XML_3.99-0.23 AnnotationDbi_1.75.2
#> [13] DelayedArray_0.39.3 SparseArray_1.13.2
#> [15] S4Arrays_1.13.0 abind_1.4-8
#> [17] Matrix_1.7-5 dplyr_1.2.1
#> [19] msigdbr_26.1.0 airway_1.33.2
#> [21] SummarizedExperiment_1.43.0 Biobase_2.73.1
#> [23] GenomicRanges_1.65.1 Seqinfo_1.3.0
#> [25] IRanges_2.47.2 S4Vectors_0.51.5
#> [27] BiocGenerics_0.59.10 generics_0.1.4
#> [29] MatrixGenerics_1.25.0 matrixStats_1.5.0
#> [31] SPAROscore_0.99.3 rmarkdown_2.31
#>
#> loaded via a namespace (and not attached):
#> [1] RcppAnnoy_0.0.23 splines_4.6.1
#> [3] later_1.4.8 tibble_3.3.1
#> [5] polyclip_1.10-7 fastDummies_1.7.6
#> [7] lifecycle_1.0.5 globals_0.19.1
#> [9] lattice_0.22-9 MASS_7.3-66
#> [11] magrittr_2.0.5 plotly_4.12.0
#> [13] sass_0.4.10 jquerylib_0.1.4
#> [15] yaml_2.3.12 httpuv_1.6.17
#> [17] otel_0.2.0 sctransform_0.4.3
#> [19] spam_2.11-4 spatstat.sparse_3.2-0
#> [21] reticulate_1.46.0 cowplot_1.2.0
#> [23] pbapply_1.7-4 DBI_1.3.0
#> [25] buildtools_1.0.0 RColorBrewer_1.1-3
#> [27] Rtsne_0.17 purrr_1.2.2
#> [29] ggrepel_0.9.8 irlba_2.3.7
#> [31] listenv_1.0.0 spatstat.utils_3.2-4
#> [33] maketools_1.3.2 goftest_1.2-3
#> [35] RSpectra_0.16-2 spatstat.random_3.5-0
#> [37] fitdistrplus_1.2-6 parallelly_1.48.0
#> [39] DelayedMatrixStats_1.35.0 codetools_0.2-20
#> [41] tidyselect_1.2.1 farver_2.1.2
#> [43] viridis_0.6.5 ScaledMatrix_1.21.0
#> [45] spatstat.explore_3.8-1 jsonlite_2.0.0
#> [47] BiocNeighbors_2.7.2 progressr_1.0.0
#> [49] ggridges_0.5.7 survival_3.8-9
#> [51] tools_4.6.1 ica_1.0-3
#> [53] Rcpp_1.1.2 glue_1.8.1
#> [55] gridExtra_2.3.1 BiocBaseUtils_1.15.1
#> [57] xfun_0.60 withr_3.0.3
#> [59] fastmap_1.2.0 rsvd_1.0.5
#> [61] digest_0.6.39 R6_2.6.1
#> [63] mime_0.13 scattermore_1.2
#> [65] tensor_1.5.1 spatstat.data_3.1-9
#> [67] RSQLite_3.53.3 tidyr_1.3.2
#> [69] data.table_1.18.4 httr_1.4.8
#> [71] htmlwidgets_1.6.4 uwot_0.2.4
#> [73] pkgconfig_2.0.3 gtable_0.3.6
#> [75] blob_1.3.0 lmtest_0.9-40
#> [77] S7_0.2.2 XVector_0.53.0
#> [79] sys_3.4.3 htmltools_0.5.9
#> [81] dotCall64_1.2 scales_1.4.0
#> [83] png_0.1-9 spatstat.univar_3.2-0
#> [85] knitr_1.51 reshape2_1.4.5
#> [87] nlme_3.1-170 curl_7.1.0
#> [89] cachem_1.1.0 zoo_1.8-15
#> [91] stringr_1.6.0 KernSmooth_2.23-26
#> [93] vipor_0.4.7 parallel_4.6.1
#> [95] miniUI_0.1.2 pillar_1.11.1
#> [97] grid_4.6.1 vctrs_0.7.3
#> [99] RANN_2.6.2 promises_1.5.0
#> [101] BiocSingular_1.29.0 beachmat_2.29.0
#> [103] xtable_1.8-8 cluster_2.1.8.2
#> [105] beeswarm_0.4.0 evaluate_1.0.5
#> [107] cli_3.6.6 compiler_4.6.1
#> [109] rlang_1.3.0 crayon_1.5.3
#> [111] future.apply_1.20.2 ggbeeswarm_0.7.3
#> [113] plyr_1.8.9 stringi_1.8.7
#> [115] viridisLite_0.4.3 deldir_2.0-4
#> [117] BiocParallel_1.47.0 assertthat_0.2.1
#> [119] babelgene_22.9 Biostrings_2.81.5
#> [121] lazyeval_0.2.3 spatstat.geom_3.8-1
#> [123] RcppHNSW_0.7.0 patchwork_1.3.2
#> [125] sparseMatrixStats_1.25.0 bit64_4.8.2
#> [127] future_1.75.0 KEGGREST_1.53.5
#> [129] shiny_1.14.0 ROCR_1.0-12
#> [131] igraph_2.3.3 memoise_2.0.1
#> [133] bslib_0.11.0 bit_4.6.0