plaid backend: escape.matrix() and runEscape() gain backend = c("native", "plaid"). Setting backend = "plaid" routes ssGSEA, GSVA, UCell, and AUCell to the replaid.* family for large speed and memory gains. plaid is a Suggests, so the native path is unaffected if it is not installed. These are approximations, and the gap is wider than the plaid documentation suggests — measured pooled Pearson agreement with the native scores was roughly 0.85 (ssGSEA), 0.83 (UCell, AUCell) and 0.73 (GSVA) on a 2000-gene simulation, and lower on narrower matrices. See ?escape.matrix and the vignette before substituting one backend for the other.method = "PLAID", "singscore", and "scSE". These have no native implementation and select the plaid backend automatically.backend.args: a named list carrying method-specific tuning (alpha, tau, rowtf, aucMaxRank, rmax, nsmooth, stats, chunk, removeLog2, scoreMean). Names are validated against the target function, so typos error instead of being silently swallowed. Note backend.args$normalize is plaid's median normalization of the scores and is unrelated to escape's normalize.input.assay: choose which expression matrix to score. "auto" (default) keeps raw counts for the native backend and picks log-normalized values for plaid. "counts" and "logcounts" map to the correct layer for both Seurat and SummarizedExperiment-derived objects.SpatialExperiment support is now explicit and tested, including spatialCoords(), imgData(), and sample_id preservation through runEscape().escape.backend attribute recording the engine, method, and plaid version; runEscape() stores the same record in metadata() (SCE) or Misc() (Seurat).escape.matrix(normalize = TRUE) failed on every SummarizedExperiment-derived input with unable to find an inherited method for function 'assay' for signature 'x = "NULL"'. .pull.Enrich() used altExp(sc)[[name]], which indexes the colData of the first altExp rather than selecting the named one, and returned NULL. Now uses altExp(sc, name). This also fixes performNormalization() and performPCA() on SingleCellExperiment and SpatialExperiment objects. Reported by Cathal King, who also provided the Xenium test data.performNormalization() rewrote every _ to - to match Seurat's feature-name coercion, which meant HALLMARK_*, GO_*, and REACTOME_* sets matched nothing for matrix, SingleCellExperiment, or SpatialExperiment input. Matching is now literal first with the Seurat-mangled form as a fallback, and per-set scale factors are aligned to the enrichment columns explicitly so a partial match can never divide the wrong column.performNormalization() gives a supplied enrichment.data precedence over scores stored on the object, and warns when both are present.%||% was used but never defined; it only exists in base R >= 4.4 while the package declares R >= 4.1.runEscape() now calls escape.matrix() with named rather than positional arguments..split_cols(), .match_summary_fun(), and .filter_genes().escape.matrix() validates method up front rather than failing inside the scoring switch.SpatialExperiment fixture built at run time (no new package data), regression coverage for all three bug fixes, and plaid dispatch tests that run whether or not plaid is installed.slot argument to GetAssayData() is now defunct. All internal accessors (.cntEval(), .pull.Enrich()) now use the layer API for SeuratObject >= 5.0.0 and fall back to slot only for older versions..adding.Enrich() to use the SeuratObject package version (not sc@version) when selecting CreateAssay5Object vs CreateAssayObject, preventing mismatches on objects created across Seurat versions.performPCA() error ("Enrichment matrix must be numeric") when enrichment data is returned as a sparse matrix from the Seurat v5 layer API.devel branch to R-CMD-check and test-coverage workflow triggersv* tags to trigger).themeEscape() internal theme function for consistent visualization styling across all plotting functions.cntEval() to detect SeuratObject version and use layer argument instead of deprecated slot argument for SeuratObject >= 5.0.0ridgeEnrichment(), splitEnrichment(), geyserEnrichment(), heatmapEnrichment(), scatterEnrichment(), pcaEnrichment(), densityEnrichment(), gseaEnrichment(), enrichItPlot())densityEnrichment(): Added plot title showing gene set name, alphanumeric sorting of group labels, and improved rug segment styling\code{}, \itemize{}, \enumerate{}, \strong{}, and \emph{} tagsBioconductor Release 3.22
densityEnrichment() interaction with GSVA package through compute.gene.cdf — corrected boolean argument for internal CDF computationgeyserEnrichment() gains summarise.by argument to collapse data (e.g., by patient ID) before plottingcolor.by now accepts both metadata columns and features (other gene sets) across geyserEnrichment(), heatmapEnrichment(), ridgeEnrichment(), scatterEnrichment(), and splitEnrichment()gseaEnrichment() missing attribute error and plotting issuescolor.by checks to correctly determine if a variable is a feature or metadata columndgCMatrix scaling input in geyserEnrichment() — sparse matrices were not handled beforeheatmapEnrichment() (issue #160)t() calls on sparse matrices by properly handling dgCMatrix in internal utilitiesrowSums2() now ignores NAs, fixing errors when NA values were present in the expression matrixDelayedMatrixStats as a conditional dependency for dgCMatrix count matricesenrichIt() -- rank-based GSEA wrapper via fgsea for differential gene expression analysisenrichItPlot() -- visualization helper for enrichIt() results using network-style gene set plotsgseaEnrichment() -- classic GSEA enrichment plot with running enrichment score, rug marks, and NES/p-value display| Area | Function(s) | What changed |
|------|-------------|--------------|
| Visualisation | ridgeEnrichment() | True gradient coloring for numeric color.by; optional per-cell rugs; quantile median line; fixed grey-fill bug |
| | densityEnrichment() | New rug.height parameter; ~4x faster ranking via MatrixGenerics::rowMeans2; cleaner two-panel layout via patchwork |
| | gseaEnrichment() | New rug.height parameter; legend shows ES/NES/p; vectorised ES calculation |
| | splitEnrichment() | Rewritten: split violins when split.by has 2 levels, dodged violins otherwise; inline boxplots; auto Z-scaling |
| | scatterEnrichment() | Density-aware points via ggpointdensity; hex-bin alternative; optional Pearson/Spearman overlay; continuous or discrete color mapping |
| Dimensionality reduction | performPCA() / pcaEnrichment() | Uses irlba::prcomp_irlba() for large matrices; stores eigen-values/contribution in misc; add.percent.contribution now always respected |
| Scoring backend | escape.matrix() / .compute_enrichment() | Lazy loading of heavy back-ends (GSVA, UCell, AUCell); unified .build_gsva_param(); drops empty gene-sets up-front |
| Normalization | performNormalization() | Chunk-wise expressed-gene scaling (memory-friendly); accepts external scale.factor; optional signed log-transform; returns object with assay <assay>_normalized |
| Gene-set retrieval | getGeneSets() | Downloads cached under tools::R_user_dir("escape", "cache"); graceful KEGG append; clearer error for non-human/mouse requests |
.colorizer(), .colorby(), .orderFunction()) removed redundant tidyverse imports.split_* helpers to cap memory during parallel scoring/normalizationridgeEnrichment() no longer produces grey fills when the chosen gene-set is mapped to color.bypcaEnrichment() axis labels correctly include variance contribution when display.factors = FALSE.grabDimRed() handles both Seurat v5 and <v5 slot structures; fixes missing eigen-values for SCE objectsescape.matrix() respects min.size = NULL (no filtering) and handles zero-overlap gene-sets gracefullyna.omit, value, etc.Config/reticulate for BiocParallelescape.gene.sets data object now fully documented with source, usage, and referenceescape.matrix() now silently removes gene-sets with zero detected featuresgetGeneSets() gains local caching; supports only Homo sapiens / Mus musculusgroups parameter handling and data splitting in escape.matrix()performNormalization() per-gene-set rescalingMatrix::t() explicitly to resolve sparse matrix transposition issuesperformNormalization() conditional logic and per-gene-set rescalingheatmapEnrichment()densityEnrichment() GSVA function pull to match new APIdensityEnrichment() for new GSVA function nameperformNormalization()getGeneSets() to prevent issues with m_df errorperformNormalization() errors when input.data was a matrix; now requires single-cell object and enrichment datarunEscape() functionBPPARAM argument to runEscape() and escape.matrix()runEscape() and escape.matrix() for make.positivesplitEnrichment() for group.by = NULLrunEscape() -- convenience wrapper to compute and attach enrichment as a new assaygeyserEnrichment() -- geyser-style enrichment visualizationscatterEnrichment() -- scatter plot for pairwise gene set comparisonheatmapEnrichment() -- heatmap of enrichment scores across groupsenrichIt() to escape.matrix()enrichmentPlot() to densityEnrichment()performPCA() now works with a matrix or single-cell objectpcaEnrichment() combines biplot-like functionsgetGeneSets() to output a list of gene set objects with reformatted names following the Seurat "-" conventiongetSignificance()masterPCAPlot()masterPCAPlot top_n() call to slice_max by top.contributionsperformPCA, eliminated merge callgetSignificance()getSignificance() outputgetSignificance() returns p-values for each comparison using TukeyHSD()gene.sets parameter in getSignificance() to select specific gene setsenrichmentPlot() beta releasesubcategory to getGeneSets() for library subset selectionmin.size filtering now works correctlymin.size parameter to enrichIt() for gene set size filteringgene.sets parameter in masterPCAPlot() and performPCA() for column selectionDietSeurat() call in vignette to prevent issuesescape.gene.sets)lm.fit using limma from getSignificance()getSignificance() ANOVA model callgetSignificance() fit call to match documentationmatch.args() in getSignificance()match.args() in getSignificance()match.args() to getSignificance()stop() to message()getSignificance() to allow ANOVA and T-testgetGeneSets()enrichIt() callgsva() and added BiocParallelcores = 4 to cores = 2 in the vignette