Every exported function is now snake_case, and plotting functions are named for what they produce rather than the library that renders them. This removes two problems with the previous names: plotly_* collided in spirit with plotly’s own exports (plotly_build(), plotly_json(), etc.), and colMedians()/colGeomMeans() masked matrixStats::colMedians() with different output (added row names). See CONTRIBUTING.md for the naming convention going forward. No deprecated aliases are kept for the old names — the next release of this package should be a major version bump. Renamed functions:
S4 class constructors (ExploratorySummarizedExperiment, ExploratorySummarizedExperimentList) are unchanged — PascalCase stays the convention for these, matching Bioconductor practice.
Documentation
The pkgdown site gains screenshots and diagrams: a home-page gallery, a screenshot for almost every analysis panel in the module/panel catalogue (including the platform-specific DEXSeq and Illumina array QC panels), and architecture diagrams showing how input data becomes an app (the data model article) and how modules compose into one (the developer guide).
The single monolithic vignette has been split into a set of task-focused articles: getting started, the data model, building an app from files, a command-line interface reference, a module/panel catalogue, reusing components inside and outside Shiny, theming and shareable views, and a developer guide. The pkgdown site gains an articles menu and a changelog.
Clarified that read_differential()/compile_contrast_data() and the --fold_change_scale CLI flag always return/store fold changes on a linear scale: whenever the scale resolves to log2 (the common case for a log2FoldChange-named column), the values are converted from the file’s log2 scale to linear, so callers relying on passthrough of the raw file values should pass fold_change_scale = "linear" explicitly (#272).
New features
interactive_scatterplot() gains an opt-in colorby_menu dropdown for switching the colouring variable within a single self-contained widget, plus xrange/yrange arguments for pinning axis ranges (e.g. a symmetric volcano axis).
A generic category-counts plot for feature and sample metadata.
Improvements
Every interactive plot’s download button honours an app-wide PNG/SVG format toggle, so any plot can be exported as vector SVG for publication.
Dropped the reformulas and data.table dependencies.
Progress and warning logging during object construction and validation now goes through message()/warning() rather than print(), so it can be suppressed and captured through R’s condition system.
interactive_heatmap()’s column annotation color bars are drawn taller (32px per variable, up from 20px) so they’re easier to read, and its cexCol/cexRow defaults are larger (0.9, up from 0.7) so column and row labels are more legible.
Bug fixes
runPCA() and compile_pca_data() no longer force prcomp()’s scale. = TRUE. They now default to scale = FALSE, matching DESeq2::plotPCA()’s convention for variance-stabilised (VST/rlog) input: since that transform already equalises per-feature variance, further unit-variance scaling mostly up-weights noisy, near-constant features rather than revealing structure, which was found to weaken the association between the top PCs and experimental variables of interest in the “Principal components / metadata associations” view. A new scale_features argument lets callers opt back into scaling for matrices without a variance-stabilising transform; exec/exploratory_plots.R exposes this as --pca_scale/-c.
make_color_scale() picked a named RColorBrewer palette’s own 2-colour scheme by interpolating its full colour set down to 3 shades and subsetting, which could land on adjacent, low-contrast hues (e.g. "Set1" giving red and orange rather than red and blue) for 2-3 category plots such as interactive_topgene_boxplots()’s group legend.
upset_calculate_intersections() always reported the highest-order (all-sets) intersection as 0 under the default intersection_assignment_type = "upset", because the top intersection’s own index range for “higher-order” members counted backwards and ended up excluding it from itself. This made interactive_upset()’s upset-style plots under-report the deepest intersection whenever sets genuinely overlapped at every level.
interactive_upset()’s set-size bar chart had no axis title, was squeezed into a small fraction of the figure’s width, and ran left-to-right with 0 on the left, unlike the conventional UpSet layout where the set-size bars grow leftward from a 0 next to the intersection grid. The chart now has a “Set size” axis title (with an explicit tickangle to keep it stable when the plot is rendered in an initially-hidden tab), a larger width allocation, and a reversed x-axis. The intersection-size chart’s axis title was also corrected from “Intersections size” to “Intersection size”.
Maintenance
Removed the unused exported function geom_mean(); geometric means are computed directly by col_geom_means().
Declared grDevices under Imports (it was already used).
Normalised a handful of module house-style outliers: the shared differential-scatter helper trio is now differentialscatterInput() / differentialscatterOutput() / differentialscatterLogic() (lowercase, and no misleading Server suffix on the non-module logic helper); contrasts.R now uses validate(need()) throughout instead of a mix with req(); and plotlyOutput() heights consistently use a quoted "NNNpx" string for fixed heights or a bare numeric for computed ones.