Date: 2026-04-28

# Shiny App

Kevin Stachelek1* and Bhavana Bhat1**

1University of Southern California

*kevin.stachelek@gmail.com
**bbhat@usc.edu

#### 28 April 2026

#### Package

chevreulShiny 1.5.0

chevreulShiny allows exploratory data analysis of a single cell dataset processed using `SingleCellExperiment` with the command `minimalSceApp()`

Here we’ll provide a brief tour of this app organized by section with app functions organized as tabs along the sidebar upon startup.

### 0.0.1 Reformat Metadata

Arbitrary variables can be appended to the cell metadata based on the results of exploratory data analysis.

Metadata addition can be executed by uploading a csv with row names matching cell ids with new variables as columns. Metadata editing can also be accomplished using a built-in spreadsheet tool.

### 0.0.2 Plot Data

#### 0.0.2.1 Dimensional reduction plots

chevreulShiny provides visualization of embeddings in PCA, tSNE, and UMAP for scRNAseq data summarized at the gene and transcript level. Plots can be customized to display cell metadata and the results of community detection clustering by Louvain or Leiden algorithms as implemented in SingleCellExperiment. In addition, gene and transcript feature expression can be overlaid on embedding plots both at the gene and transcript level.

#### 0.0.2.2 read/UMI count histograms

To facilitate quality control, cell-level summarized UMI and read count values can also be overlaid with cell metadata and clustering results.

#### 0.0.2.3 Clustering trees

A cluster tree of cell identities is displayed using scclustviz. This plot can be used to help establish an optimal clustering resolution.

In order to use this function `library(clustree)` must be loaded.

### 0.0.3 Heat Maps/Violin Plots

#### 0.0.3.1 Heat Maps

When plotting the heat map, gene/transcript expression values for each cell are normalized by that cell’s total expression then multiplied by 10,000 and natural-log transformed before plotting.

Clustering model or metadata for column arrangement is taken as a parameter to produce a complex heat map.

By default, 50 most highly variable genes are displayed. However, an arbitrary lists of genes can be plotted for comparison. The genes/transcripts are displayed in the order they are listed.

#### 0.0.3.2 Violin Plots

Feature (gene or transcript) expression can be viewed by violin plot based on sample metadata

Violin plots are a hybrid of density and box plots. It shows the probability density of the data at different values providing a visual representation of distribution of expression level of a feature in different groups of cell. The horizontal line is a marker for the median of the data and the box shows the interquartile ranges.

The parameters that could to be chosen here are: 1. ‘Grouping variable’ 2. ‘Data Type (Transformed/Raw)’

### 0.0.4 Differential expression

chevreulShiny provides different methods of differential expression analysis that users can choose from to determine differential expression of gene. DE methods included in chevreulShiny are t-test, Wilcoxon rank-sum test, and pairwise binomial test.

Running DE testing results in a data frame containing the following information: * p_val : Unadjusted p-value * avg_log2FC : log fold-change of the average expression between the two groups. * pct.1 : The percentage of cells where the feature is detected in the first group * pct.2 : The percentage of cells where the feature is detected in the second group * p_val_adj : Adjusted p-value, based on bonferroni correction using all features in the dataset.

    d1 <- read.csv("Dominic.csv", header = TRUE)

#### 0.0.4.1 Volcano Plots

The results of differential expression analyses can be visualized using a volcano plot. This plot helps in visual identification of genes with large fold changes that are also statistically significant.

### Find Markers

Marker features based on louvain/leiden cluster identities or cell metadata can be defined based on results of wilcoxon rank-sum test. Variable numbers of marker genes per cell group can be specified based on adjusted p value and thresholded log fold change.

### 0.0.5 Subset SingleCellExperiment Input

It is often useful to subset a single cell data set based on cell metadata whether experimentally determined (age, collection method, etc.) or derived from analysis (quality control metrics, annotated cell type)

chevreulShiny makes it simple to subset a dataset consisting of a single batch or batch-integrated dataset. Subsetting can be accomplished either in a graphical setting by lasso-selection from a dimensionally reduced plot or by by specification of a formatted .csv file.

Subsetting of single or batch integrated data will trigger renewal of all relevant preprocessing steps including dimensional reduction, clustering, marker gene, and pathway enrichment as well as integration based on a ‘batch’ variable

### 0.0.6 All Transcripts

If expression is summarized with both gene and transcript experiments, it is possible to plot all constituent transcripts (labeled by ensembl transcript ids) making up a given gene.

The two parameters that must be chosen are:

1. dimensional reduction method: PCA, UMAP or tSNE
2. The name of the gene of interest

Direct comparison of the contribution of individual transcripts can be achieved using stacked bar plots to answer the question: What contribution does each transcript make for each gene expression?

### 0.0.7 Regress Features

To correct for expression variation in analysis due to phenomena unrelated to focus of the study, rather than excluding count values attributable to such process, we can adjust the expression of all remaining genes or transcripts in each cell based on the sum score of relevant genes, to regress out cell-cycle effects.

### 0.0.8 Technical information

Technical information regarding upstream processing, software version numbers, and dataset features can be viewed.

## 0.1 Server Mode

If we want work with objects interactively and save the results of our exploratory data analysis we need to operate chevreulShiny in server mode. When operating in this manner it is possible to carry out basic project management tasks including: * Loading saved objects * Saving objects after making changes in the app such as : * Reformatting metadata * Subsetting to remove cells * Regressing feature expression as well as * Integrating multiple saved objects

Finally, server mode is necessary for some expanded functionality including: * Coverage plotting

server mode requires access to a few sqlite databases with file path details stored in `~/.cache/chevreul`. `single_cell_projects.db` and `bigwig_files.db` allowing dynamic loading of objects and bigwig (.bw) sample coverage files for each cell. These are initialized upon package installation using the `creat_project_db` function.

The following sections will give details on this expanded functionality.

### 0.1.1 Integrate Projects

While operating chevreulShiny in server mode, separate sequencing batches can be integrated and compared to validate sample processing steps and exclude technical variation in favor of relevant biological variation.

This section includes a list of projects that can be selected, integrated, and saved for future analysis.

### 0.1.2 Coverage plots

Fine-grained analysis of isoform contributions can be achieved by plotting absolute read coverage plots across a given gene.

indicate the **read depths across all transcripts for different groups of cells within a genomic region.

The three user input parameters are: 1. ‘Select a gene’- Select a gene of interest 2. ‘Color by variable’- Select a variable by which to group the cells by 3. ‘Groups to display’- Select the groups to be displayed

## 0.2 Session information

    #> R version 4.6.0 RC (2026-04-17 r89917)
    #> Platform: x86_64-pc-linux-gnu
    #> Running under: Ubuntu 24.04.4 LTS
    #>
    #> Matrix products: default
    #> BLAS:   /home/biocbuild/bbs-3.24-bioc/R/lib/libRblas.so
    #> LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.12.0  LAPACK version 3.12.0
    #>
    #> locale:
    #>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_GB              LC_COLLATE=C
    #>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C
    #>  [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
    #>
    #> time zone: America/New_York
    #> tzcode source: system (glibc)
    #>
    #> attached base packages:
    #> [1] stats4    stats     graphics  grDevices utils     datasets  methods   base
    #>
    #> other attached packages:
    #>  [1] chevreulShiny_1.5.0         chevreulPlot_1.5.0          chevreulProcess_1.5.0       scater_1.41.0
    #>  [5] ggplot2_4.0.3               scuttle_1.23.0              shinydashboard_0.7.3        shiny_1.13.0
    #>  [9] SingleCellExperiment_1.35.0 SummarizedExperiment_1.43.0 Biobase_2.73.0              GenomicRanges_1.65.0
    #> [13] Seqinfo_1.3.0               IRanges_2.47.0              S4Vectors_0.51.0            BiocGenerics_0.59.0
    #> [17] generics_0.1.4              MatrixGenerics_1.25.0       matrixStats_1.5.0           BiocStyle_2.41.0
    #>
    #> loaded via a namespace (and not attached):
    #>   [1] fs_2.1.0                  ProtGenerics_1.45.0       bitops_1.0-9              httr_1.4.8
    #>   [5] RColorBrewer_1.1-3        doParallel_1.0.17         tools_4.6.0               alabaster.base_1.13.0
    #>   [9] R6_2.6.1                  DT_0.34.0                 ResidualMatrix_1.23.0     lazyeval_0.2.3
    #>  [13] DataEditR_1.0.0           rhdf5filters_1.25.0       GetoptLong_1.1.1          withr_3.0.2
    #>  [17] gridExtra_2.3             cli_3.6.6                 EnsDb.Hsapiens.v86_2.99.0 shinyjs_2.1.1
    #>  [21] sass_0.4.10               S7_0.2.2                  readr_2.2.0               Rsamtools_2.29.0
    #>  [25] yulab.utils_0.2.4         shinyhelper_0.3.2         dichromat_2.0-0.1         parallelly_1.47.0
    #>  [29] limma_3.69.0              rstudioapi_0.18.0         RSQLite_2.4.6             gridGraphics_0.5-1
    #>  [33] shape_1.4.6.1             BiocIO_1.23.0             dplyr_1.2.1               Matrix_1.7-5
    #>  [37] ggbeeswarm_0.7.3          abind_1.4-8               lifecycle_1.0.5           yaml_2.3.12
    #>  [41] edgeR_4.11.0              rhdf5_2.57.0              SparseArray_1.13.0        grid_4.6.0
    #>  [45] blob_1.3.0                promises_1.5.0            dqrng_0.4.1               crayon_1.5.3
    #>  [49] miniUI_0.1.2              lattice_0.22-9            beachmat_2.29.0           GenomicFeatures_1.65.0
    #>  [53] cigarillo_1.3.0           KEGGREST_1.53.0           pillar_1.11.1             knitr_1.51
    #>  [57] ComplexHeatmap_2.29.0     metapod_1.21.0            rjson_0.2.23              codetools_0.2-20
    #>  [61] glue_1.8.1                data.table_1.18.2.1       vctrs_0.7.3               png_0.1-9
    #>  [65] EnhancedVolcano_1.31.0    gtable_0.3.6              cachem_1.1.0              xfun_0.57
    #>  [69] S4Arrays_1.13.0           mime_0.13                 tidygraph_1.3.1           megadepth_1.23.0
    #>  [73] iterators_1.0.14          statmod_1.5.1             bluster_1.23.0            bit64_4.8.0
    #>  [77] GenomeInfoDb_1.49.0       bslib_0.10.0              irlba_2.3.7               vipor_0.4.7
    #>  [81] otel_0.2.0                colorspace_2.1-2          DBI_1.3.0                 tidyselect_1.2.1
    #>  [85] waiter_0.2.5.1            bit_4.6.0                 compiler_4.6.0            curl_7.1.0
    #>  [89] BiocNeighbors_2.7.0       rhandsontable_0.3.8       DelayedArray_0.39.0       plotly_4.12.0
    #>  [93] bookdown_0.46             rtracklayer_1.73.0        scales_1.4.0              wiggleplotr_1.37.0
    #>  [97] rappdirs_0.3.4            stringr_1.6.0             digest_0.6.39             shinyBS_0.65.0
    #> [101] rmarkdown_2.31            XVector_0.53.0            htmltools_0.5.9           pkgconfig_2.0.3
    #> [105] sparseMatrixStats_1.25.0  fastmap_1.2.0             ensembldb_2.37.0          rlang_1.2.0
    #> [109] GlobalOptions_0.1.4       htmlwidgets_1.6.4         UCSC.utils_1.9.0          DelayedMatrixStats_1.35.0
    #> [113] farver_2.1.2              jquerylib_0.1.4           jsonlite_2.0.0            BiocParallel_1.47.0
    #> [117] BiocSingular_1.29.0       RCurl_1.98-1.18           magrittr_2.0.5            ggplotify_0.1.3
    #> [121] patchwork_1.3.2           Rhdf5lib_2.1.0            Rcpp_1.1.1-1.1            viridis_0.6.5
    #> [125] stringi_1.8.7             alabaster.schemas_1.13.0  ggraph_2.2.2              MASS_7.3-65
    #> [129] shinyFiles_0.9.3          parallel_4.6.0            listenv_0.10.1            ggrepel_0.9.8
    #> [133] forcats_1.0.1             Biostrings_2.81.0         graphlayouts_1.2.3        hms_1.1.4
    #> [137] circlize_0.4.18           locfit_1.5-9.12           clustree_0.5.1            igraph_2.3.0
    #> [141] ScaledMatrix_1.21.0       XML_3.99-0.23             evaluate_1.0.5            scran_1.41.0
    #> [145] BiocManager_1.30.27       tzdb_0.5.0                foreach_1.5.2             tweenr_2.0.3
    #> [149] httpuv_1.6.17             batchelor_1.29.0          tidyr_1.3.2               purrr_1.2.2
    #> [153] polyclip_1.10-7           future_1.70.0             clue_0.3-68               ggforce_0.5.0
    #> [157] rsvd_1.0.5                xtable_1.8-8              restfulr_0.0.16           AnnotationFilter_1.37.0
    #> [161] later_1.4.8               viridisLite_0.4.3         tibble_3.3.1              memoise_2.0.1
    #> [165] beeswarm_0.4.0            AnnotationDbi_1.75.0      GenomicAlignments_1.49.0  cluster_2.1.8.2
    #> [169] shinyWidgets_0.9.1        globals_0.19.1            cmdfun_1.0.2