Analysis Guides
Sep 20, 2022

Integrating 10x Visium and Chromium data with R

Share via:

Note: 10x Genomics does not provide support for community-developed tools and makes no guarantees regarding their function or performance. Please contact tool developers with any questions. If you have feedback about Analysis Guides, please email [email protected].


As discussed in the Integrating Single Cell and Visium Spatial Gene Expression data Analysis Guide, several software tools have been developed for cell type deconvolution analysis of spatial transcriptomic datasets using single cell reference data. In a recent software benchmarking study, Li et al. (2022) showed that the R package spacexr (Cable et al. 2022) performed well across a variety of public and simulated datasets.

The purpose of this guide is to demonstrate how to use spacexr to integrate 10x Genomics single cell (Chromium) and spatial (Visium) gene expression data starting from Cell Ranger and Space Ranger software outputs.

Table of contents

Step 1: Download and install software


  • Linux system to run Space Ranger and Cell Ranger
  • Space Ranger (tested on v1.3, v2.0)
  • Cell Ranger (tested on v7.0)
  • R (v4.0.3+)

Step 2: Download and unpack data

For this example, we create the cell type reference from a Chromium 3' Single Cell Gene Expression mouse brain nuclei dataset to deconvolve cell types per spot in a Visium for FFPE mouse brain spatial dataset. To follow along, either A) download the input FASTQ files or B) download Space Ranger and Cell Ranger outputs from the 10x Genomics public datasets page. Run the following code in a Linux environment.

Create the working directory:

mkdir adult_mouse_brain_FFPE
mkdir adult_mouse_brain_SC

A) Download input FASTQ files

Download the mouse reference and FASTQ files for Visium and Chromium data into this directory:

# Download reference
curl -O

# Untar the reference
tar -xf refdata-gex-mm10-2020-A.tar.gz
# Change directory to adult_mouse_brain_FFPE
cd adult_mouse_brain_FFPE

# Download visium inputs
curl -O
curl -O
curl -O

# Untar the FASTQs
tar -xf Visium_FFPE_Mouse_Brain_fastqs.tar
# Change directory from adult_mouse_brain_FFPE to adult_mouse_brain_SC
cd ../adult_mouse_brain_SC

# Download FASTQs
curl -O

# Untar the FASTQs
tar -xf 5k_mouse_brain_CNIK_3pv3_fastqs.tar

The input working directory should look like:

├── adult_mouse_brain_FFPE
│   ├── Visium_FFPE_Mouse_Brain_fastqs
│   ├── Visium_FFPE_Mouse_Brain_image.jpg
│   └── Visium_FFPE_Mouse_Brain_probe_set.csv
├── adult_mouse_brain_SC
│   └── 5k_mouse_brain_CNIK_3pv3_fastqs
└── refdata-gex-mm10-2020-A

B) Download outputs from public datasets page

Alternatively, you can download the Visium and Chromium outputs from the 10x Genomics public datasets page. After downloading the files below, skip to step 5.

  • For the Visium dataset (analyzed with Space Ranger v1.3):
# Change directory to adult_mouse_brain_FFPE
cd adult_mouse_brain_FFPE

# Download these files
curl -O
curl -O

# Untar the spatial.tar.gz file, there should be a spatial/ directory that contains the tissue_positions_list.csv file
tar -xf Visium_FFPE_Mouse_Brain_spatial.tar.gz

# Rename the feature-barcode matrix file so it is recognized by the spacexr data input function
mv Visium_FFPE_Mouse_Brain_filtered_feature_bc_matrix.h5 filtered_feature_bc_matrix.h5
  • For the Chromium dataset (analyzed with Cell Ranger v7.0):
# Change directory from adult_mouse_brain_FFPE to adult_mouse_brain_SC
cd ../adult_mouse_brain_SC

# Download this file
curl -O

The input working directory should look like:

├── adult_mouse_brain_FFPE
│   ├── filtered_feature_bc_matrix.h5 #this is the renamed visium feature-barcode matrix file
│   └── spatial
│        ├── aligned_fiducials.jpg
│        ├── detected_tissue_image.jpg
│        ├── scalefactors_json.json
│        ├── tissue_hires_image.png
│        ├── tissue_lowres_image.png
│        └── tissue_positions_list.csv #this is the v1.3 coordinates file, note it is called tissue_positions.csv in v2.0
└── adult_mouse_brain_SC
    └── 5k_mouse_brain_CNIK_3pv3_filtered_feature_bc_matrix.h5 #this is the SC feature-barcode matrix file 

Step 3: Run Cell Ranger

Run Cell Ranger in a Linux environment (computing options here). Warning: By default, Cell Ranger will use all of the cores available on your system to execute pipeline stages. See cellranger count documentation for additional options.

If you downloaded the FASTQ files, set up and run the Cell Ranger command below (be sure to edit /path/to/):

cellranger count --id=5k_adult_mouse_brain_SC_RUN1 \
                 --transcriptome=/path/to/refdata-gex-mm10-2020-A \

Step 4: Run Space Ranger

Run Space Ranger in a Linux environment (computing options here). Warning: By default, Space Ranger will use all of the cores available on your system to execute pipeline stages. See spaceranger count documentation for additional options.

If you downloaded the FASTQ files, set up and run the Space Ranger command below (be sure to edit /path/to/):

spaceranger count --id=Visium_FFPE_Mouse_Brain_RUN1 \
                  --transcriptome=/path/to/refdata-gex-mm10-2020-A \
                  --probe-set=/path/to/adult_mouse_brain_FFPE/Visium_FFPE_Mouse_Brain_probe_set.csv \
                  --fastqs=/path/to/adult_mouse_brain_FFPE/Visium_FFPE_Mouse_Brain_fastqs \
                  --image=/path/to/adult_mouse_brain_FFPE/Visium_FFPE_Mouse_Brain_image.jpg \
                  --slide=V11J26-127 \

Step 5: Install and load R packages

The rest of this guide will be done in R. If you are running the R analysis on a different system (e.g., local computer) than the one used to generate Cell Ranger and Space Ranger outputs (e.g., cluster), you'll need to download, at minimum, the following files:

├── adult_mouse_brain_FFPE
│   ├── filtered_feature_bc_matrix.h5 #the visium feature-barcode matrix file
│   └── spatial
│        └── tissue_positions.csv #for SRv2.0, or tissue_positions_list.csv for SRv1.3
└── adult_mouse_brain_SC
    └── filtered_feature_bc_matrix.h5 #the chromium feature-barcode matrix file 

Note that Space Ranger v1.3 tissue_positions_list.csv is the same as Space Ranger v2.0 tissue_positions.csv, the latter has column headers but the values are the same.

In R, install and load the following R packages:

# Install R packages (only need to do this once, or if you need to update packages)
devtools::install_github("dmcable/spacexr", build_vignettes = FALSE)

# Load libraries
library(ggplot2) #for saving result plots

Step 6: Load and format Visium data

For the next steps, you'll need to know the path to the Cell Ranger and Space Ranger output files. The example code has placeholders /path/to/ that must be replaced to run; they have been written assuming the file structure shown in Step 2.

Spacexr requires two of the Space Ranger output files and the data structure/file names must look like this to use the read.VisiumSpatialRNA() function:

├── filtered_feature_bc_matrix.h5
└── spatial
    └── tissue_positions.csv #for SRv2.0, or tissue_positions_list.csv for SRv1.3

The filtered_feature_bc_matrix.h5 file provides the gene-barcode count matrix information and the tissue_positions.csv provides the x-y coordinates for the spots on the tissue.

Optional: To match the orientation of the tissue on the slide with spacexr result plots, we will flip and mirror the coordinates:

# Read in the tissue_positions_list.csv file (path dependent on data download method from step 2)
vis_coords <- read.csv('/path/to/adult_mouse_brain_FFPE/Visium_FFPE_Mouse_Brain_RUN1/outs/spatial/tissue_positions.csv', 
# Or if you downloaded the outputs from the 10x Genomics public datasets page:
#vis_coords <- read.csv('/path/to/adult_mouse_brain_FFPE/spatial/tissue_positions_list.csv', 
#                       header=FALSE)

# Col 3 is the x coord
# Col 4 is the y coord

The Space Ranger v2.0 tissue_positions.csv looks like this:

           barcode in_tissue array_row array_col pxl_row_in_fullres pxl_col_in_fullres
1 ACGCCTGACACGCGCT-1         0         0         0               5247              21461
2 TACCGATCCAACACTT-1         0         1         1               5392              21208
3 ATTAAAGCGGACGAGC-1         0         0         2               5537              21461
4 GATAAGGGACGATTAG-1         0         1         3               5682              21208
5 GTGCAAATCACCAATA-1         0         0         4               5828              21460
6 TGTTGGCTGGCGGAAG-1         0         1         5               5972              21208
# Multiply x and y coordinates by -1 to flip/mirror
vis_coords[,3] <- vis_coords[,3]*-1
vis_coords[,4] <- vis_coords[,4]*-1

The x-y coordinates are now flipped:

             barcode in_tissue array_row array_col pxl_row_in_fullres pxl_col_in_fullres
1 ACGCCTGACACGCGCT-1         0         0         0               5247              21461
2 TACCGATCCAACACTT-1         0        -1        -1               5392              21208
3 ATTAAAGCGGACGAGC-1         0         0        -2               5537              21461
4 GATAAGGGACGATTAG-1         0        -1        -3               5682              21208
5 GTGCAAATCACCAATA-1         0         0        -4               5828              21460
6 TGTTGGCTGGCGGAAG-1         0        -1        -5               5972              21208
# Resave file.
# Note that due to the file name requirement, we will write over the original file with this new one
write.table(vis_coords, '/path/to/adult_mouse_brain_FFPE/Visium_FFPE_Mouse_Brain_RUN1/outs/spatial/tissue_positions.csv', quote=FALSE, row.names=FALSE, sep=',')

# Or if you downloaded the outputs from the 10x Genomics public datasets page:
#write.table(vis_coords[-1,], './adult_mouse_brain_FFPE/spatial/tissue_positions_list.csv', 
#            quote=FALSE, row.names=FALSE, col.names=FALSE, sep=',')

Now, we will use the read.VisiumSpatialRNA() function to read in the Visium data.

# Load Visium data directly from Space Ranger output directory

# Or if you downloaded the outputs from the 10x Genomics public datasets page:

The output message contains this warning; it is okay to continue.

Warning message:
In SpatialRNA(coords[, c("x", "y")], counts) :
  SpatialRNA: some barcodes in nUMI, coords, or counts were not mutually shared. Such barcodes were removed.
# Create a list of barcodes from the column names of the count matrix
barcodes <- colnames([email protected])

# Plot number of UMIs per barcode (spot)
plot_puck_continuous(puck=VisiumData, barcodes=barcodes, [email protected], 
                     size=1, ylimit=c(0,round(quantile([email protected],0.9))), 
                     title='plot of nUMI') 

Note that this image now resembles the tissue on the slide (web summary slide image).

Step 7a: Load and format Chromium data

Spacexr requires the filtered_feature_bc_matrix.h5 output from Cell Ranger, as well as an annotation file with cell types for each barcode.

We are using Seurat to format the feature-barcode matrix information into a single count matrix for spacexr.

# Load single cell data from Cell Ranger output directory
# Or if you downloaded the outputs from the 10x Genomics public datasets page:

# Create new Seurat Object from the count input

# Create a count matrix object and take a look at the matrix
sc_counts <- count_Seurat[email protected][email protected]
5 x 5 sparse Matrix of class "dgCMatrix"
Xkr4                     3                  3                  9                 12                 19
Gm1992                   .                  .                  1                  .                  .
Gm19938                  .                  .                  3                  1                  .
Gm37381                  .                  .                  .                  .                  .
Rp1                      .                  .                  .                  .                  .

Step 7b: Create cell types object

The cell type file can be generated manually with Loupe Browser using marker genes to assign barcodes to cell types or with reference databases.

In this guide, we will use the Azimuth app for reference-based single-cell analysis (Hao et al. 2021) to generate cell type annotations. To annotate the single cell mouse brain dataset, we will use the "Mouse - Motor Cortex" app (Yao et al. 2021; annotation details here). Note that there may be limitations to using a motor cortex cell type annotation reference for a whole brain sample and spot deconvolution results will be influenced by the reference used.

  1. Go to the "Mouse - Motor Cortex" reference app.
  2. Click "Browse", select the 3' Single Cell Gene Expression filtered_feature_bc_matrix.h5 file (or 5k_mouse_brain_CNIK_3pv3_filtered_feature_bc_matrix.h5 if downloaded from the public datasets page), and click "Open".
  3. We will use the "subclass" annotation level. After upload is complete, click "Map cells to reference".
  4. When annotation is complete, go to the "Download Results" tab and click "Download" under the "Predicted cell types and scores (TSV)" section.
  5. Save the TSV file in the adult_mouse_brain_SC directory.

Now, read this file into R:

# Load cell types file
cell_types <- read.csv("/path/to/adult_mouse_brain_SC/azimuth_pred.tsv", sep="\t")
  cell                   predicted.subclass predicted.subclass.score mapping.score
1 AAACCCAAGGCATCAG-1     Meis2              0.9437153                0.9711163
2 AAACCCAAGGTTCACT-1     L2/3 IT            1.0000000                0.9217411
3 AAACCCACAAAGGCTG-1     L2/3 IT            0.9975360                0.5941127
4 AAACCCACAATGACCT-1     L2/3 IT            1.0000000                0.7366843
5 AAACCCACACGAGGAT-1     Pvalb              0.3933640                0.6632925
6 AAACCCACACTAGTAC-1     L2/3 IT            1.0000000                0.9428686
# Check unique cell types
# Check how many barcodes per cell type annotation
# If needed, update annotation file to meet minimum requirements: spacexr requires at least 25 cells (barcodes) per cell type
     Astro       Endo    L2/3 IT      L5 ET      L5 IT    L5/6 NP 
       661         28       1618        128       1088         82 
     L6 CT      L6 IT L6 IT Car3        L6b      Lamp5      Meis2 
       276        574         80         69         84        382 
 Micro-PVM      Oligo        OPC       Peri      Pvalb       Sncg 
       406       1176        149         29        186         13 
       Sst  Sst Chodl        Vip       VLMC 
       113         68         49        118 

Following spacexr guidance, we modified the cell type names to remove unsupported characters (e.g., "/") and grouped cell types that had fewer than 25 cells (barcodes) per type.

# Remove /
cell_types[cell_types == "L2/3 IT"] <- "L2_3 IT"
cell_types[cell_types == "L5/6 NP"] <- "L5_6 NP"

# Group Sncg (Sncg+ GABAergic neuron) with Sst (Sst+ GABAergic neuron)
cell_types[cell_types == "Sncg"] <- "Sncg_Sst"
cell_types[cell_types == "Sst"] <- "Sncg_Sst"

The Azimuth reference file provides cell-level prediction scores and mapping scores for the cell type annotation for each barcode. Poor annotations can affect deconvolution results (read more about assessing mapping quality here). For this guide, we will keep scores greater than or equal to 0.5.

cell_types_filter <- cell_types[cell_types$predicted.subclass.score >= 0.5 & cell_types$mapping.score >=0.5, ]

Now, format object for spacexr:

# The cell_types object is a dataframe with 4 columns: cell (barcode), predicted subclass (cell type name), predicted subclass score, mapping score
# Set the cell type name and barcode as object names
cell_types <- setNames(cell_types_filter[[2]], cell_types_filter[[1]])

# Convert to factor data type
cell_types <- as.factor(cell_types) 
             Meis2            L2_3 IT            L2_3 IT 
           L2_3 IT            L2_3 IT          Micro-PVM 

Step 7c: Create nUMI object

head([email protected])

The nUMI object can be created from the nCount_RNA metadata column in the Seurat Object:

                      orig.ident nCount_RNA nFeature_RNA
AAACCCAAGGCATCAG-1 SeuratProject       2124         1199
AAACCCAAGGTTCACT-1 SeuratProject       6981         3088
AAACCCACAAAGGCTG-1 SeuratProject       9361         3545
AAACCCACAATGACCT-1 SeuratProject      13741         4284
AAACCCACACGAGGAT-1 SeuratProject      16633         4994
AAACCCACACTAGTAC-1 SeuratProject       8003         3311
# Format for spacexr
sc_umis <- [email protected][,c(1,2)]
# Set object names as nCount_RNA and barcode
sc_umis <- setNames(sc_umis[[2]], rownames(sc_umis))

Now, the UMI counts are formatted per barcode:

              2124               6981               9361              13741              16633               8003 

Step 7d: Create reference object

Finally, use the function below to create a single reference object that contains the count matrix, cell types per barcode, and number of UMIs per barcode.

# Create single cell reference object
SCreference <- Reference(sc_counts, cell_types, sc_umis)

Step 8: Create and run RCTD (robust cell type decomposition)

For this demo, we will deconvolve spots with "full" mode, which allows for any number of cell types per spot. Other mode options are "doublet" (one or two cell types per spot) or "multi" (multiple cell types per spot up to a fixed number using a greedy algorithm).

# Optional: spacexr runs faster with more cores, but you may need to adjust system environment settings

# Create and run RCTD algorithm
myRCTD <- create.RCTD(VisiumData, SCreference, max_cores = 2)
myRCTD <- run.RCTD(myRCTD, doublet_mode = "full")


The results for "full" mode are stored in the results slot of the myRCTD object.

# Create the output directory in your working directory
resultsdir <- "RCTD_output_plots/" # An output directory for plots, can be any name

# Create variables from the myRCTD object to plot results
barcodes <- colnames([email protected]@counts) # list of spatial barcodes
weights <- [email protected]$weights # Weights for each cell type per barcode

# Normalize per spot weights so cell type probabilities sum to 1 for each spot
norm_weights <- normalize_weights(weights) 
cell_type_names<-colnames(norm_weights) # List of cell types
# dim(norm_weights) # matrix of 2,264 spots and 21 cell types
# For each spot barcode (row), you can see the normalized weight for each cell type (column)

# Look at cell type normalized weights for 2 spots
subset_df <-[1:2,])))
subset_df$celltypes <- rownames(subset_df); rownames(subset_df) <- NULL
subset_df[order(subset_df$`AAACAGAGCGACTCCT-1`, decreasing=T),]

Below are the normalized weights across all 21 cell types from the single cell reference annotation file for two spots, AAACAGAGCGACTCCT-1 and AAACCCGAACGAAATC-1. The five cell types with higher normalized weights for the first spot are:

  • "L6 IT" (Layer 6 glutamatergic neuron, intratelencephalon-projecting)
  • "Astro" (Astrocyte)
  • "Oligo" (Oligodendrocyte)
  • "L5 IT" (Layer 5 glutamatergic neuron, intratelencephalon-projecting)
  • "Endo" (Endothelial cell)
        6.882424e-01       3.282160e-01      L6 IT
        8.035402e-02       1.250008e-01      Astro
        6.694975e-02       1.183004e-01      Oligo
        5.234001e-02       9.562916e-05      L5 IT
        3.463386e-02       8.976138e-02       Endo
        3.231686e-02       9.562916e-05    L2_3 IT
        1.274826e-02       2.176886e-02  Micro-PVM
        1.186839e-02       1.901338e-02       Peri
        9.478824e-03       9.562916e-05    L5_6 NP
        8.951182e-03       2.893789e-02        Vip
        1.565552e-03       9.562916e-05       VLMC
        5.508874e-05       5.950101e-02  Sst Chodl
        5.508874e-05       9.562916e-05      L5 ET
        5.508874e-05       9.562916e-05      Lamp5
        5.508874e-05       9.562916e-05        L6b
        5.508874e-05       1.660357e-01      Meis2
        5.508874e-05       9.562916e-05 L6 IT Car3
        5.508874e-05       2.510426e-02        OPC
        5.508874e-05       1.740404e-02   Sncg_Sst
        5.508874e-05       9.562916e-05      Pvalb
        5.508874e-05       9.562916e-05      L6 CT

Now, we will plot the normalized weights for the 21 cell types across all spots.

# Plot cell type probabilities (normalized) per spot (red = 1, blue = 0 probability)
# Save each plot as a jpg file
for(i in 1:length(cell_types)){
   plot_puck_continuous([email protected], barcodes, norm_weights[,cell_type_names[i]], title =cell_type_names[i], size=1)
   ggsave(paste(resultsdir, cell_type_names[i],'_weights.jpg', sep=''), height=5, width=5, units='in', dpi=300)

Here are plots showing the normalized weights for eight of the Azimuth mouse motor cortex cell types in different regions of the mouse brain sample:

To interpret the spot deconvolution results, evaluate whether they make sense in light of the sample biology, as well as the cell type reference used for annotation. Refer to the spacexr vignettes and documentation for further guidance on spacexr analyses and outputs.

This spot deconvolution method was used in the Single cell and spatial multiomics identifies Alzheimer’s disease markers Application Note, where the reference data came from multiomic gene expression data. The code from this guide can be used to similarly format inputs from the Application Note's spatial data and multiome gene expression data. Note that the gene expression count data must be specified in this case, as the multiome dataset also contains ATAC data: scdata <- CreateSeuratObject(Counts$`Gene Expression`). In addition, these datasets are much larger than those used in this guide and may require more time and computational resources to complete the analyses.


Further reading

R session info

R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Monterey 12.5

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] ggplot2_3.3.6      sp_1.5-0           SeuratObject_4.1.0 Seurat_4.1.1       spacexr_2.0.1     

loaded via a namespace (and not attached):
 [1] plyr_1.8.7            igraph_1.3.2          lazyeval_0.2.2        splines_4.2.1         listenv_0.8.0        
 [6] scattermore_0.8       usethis_2.1.6         digest_0.6.29         foreach_1.5.2         htmltools_0.5.2      
 [11] fansi_1.0.3           magrittr_2.0.3        memoise_2.0.1         tensor_1.5            cluster_2.1.3        
 [16] doParallel_1.0.17     ROCR_1.0-11           tzdb_0.3.0            remotes_2.4.2         globals_0.15.1       
 [21] readr_2.1.2           matrixStats_0.62.0    vroom_1.5.7           spatstat.sparse_2.1-1 prettyunits_1.1.1    
 [26] colorspace_2.0-3      ggrepel_0.9.1         dplyr_1.0.9           callr_3.7.0           crayon_1.5.1         
 [31] jsonlite_1.8.0        progressr_0.10.1      spatstat.data_2.2-0   survival_3.3-1        zoo_1.8-10           
 [36] iterators_1.0.14      glue_1.6.2            polyclip_1.10-0       pals_1.7              gtable_0.3.0         
 [41] leiden_0.4.2          pkgbuild_1.3.1        future.apply_1.9.0    maps_3.4.0            abind_1.4-5          
 [46] scales_1.2.0          spatstat.random_2.2-0 miniUI_0.1.1.1        Rcpp_1.0.8.3          viridisLite_0.4.0    
 [51] xtable_1.8-4          reticulate_1.25       spatstat.core_2.4-4   bit_4.0.4             mapproj_1.2.8        
 [56] htmlwidgets_1.5.4     httr_1.4.3            RColorBrewer_1.1-3    ellipsis_0.3.2        ica_1.0-2            
 [61] farver_2.1.1          pkgconfig_2.0.3       uwot_0.1.11           deldir_1.0-6          utf8_1.2.2           
 [66] labeling_0.4.2        tidyselect_1.1.2      rlang_1.0.3           reshape2_1.4.4        later_1.3.0          
 [71] munsell_0.5.0         tools_4.2.1           cachem_1.0.6          cli_3.3.0             generics_0.1.3       
 [76] devtools_2.4.3        ggridges_0.5.3        stringr_1.4.0         fastmap_1.1.0         goftest_1.2-3        
 [81] processx_3.6.1        bit64_4.0.5           fs_1.5.2              fitdistrplus_1.1-8    purrr_0.3.4          
 [86] RANN_2.6.1            pbapply_1.5-0         future_1.26.1         nlme_3.1-157          mime_0.12            
 [91] hdf5r_1.3.5           compiler_4.2.1        rstudioapi_0.13       plotly_4.10.0         curl_4.3.2           
 [96] png_0.1-7             spatstat.utils_2.3-1  tibble_3.1.7          stringi_1.7.6         ps_1.7.1             
[101] rgeos_0.5-9           lattice_0.20-45       Matrix_1.4-1          vctrs_0.4.1           pillar_1.7.0         
[106] lifecycle_1.0.1       spatstat.geom_2.4-0   lmtest_0.9-40         RcppAnnoy_0.0.19      data.table_1.14.2    
[111] cowplot_1.1.1         irlba_2.3.5           httpuv_1.6.5          patchwork_1.1.1       R6_2.5.1             
[116] promises_1.2.0.1      KernSmooth_2.23-20    gridExtra_2.3         parallelly_1.32.0     sessioninfo_1.2.2    
[121] codetools_0.2-18      dichromat_2.0-0.1     MASS_7.3-57           pkgload_1.3.0         rprojroot_2.0.3      
[126] withr_2.5.0           sctransform_0.3.3     mgcv_1.8-40           parallel_4.2.1        hms_1.1.1            
[131] quadprog_1.5-8        grid_4.2.1            rpart_4.1.16          tidyr_1.2.0           Rtsne_0.16           
[136] shiny_1.7.1