Last updated: 2022-02-10

Checks: 7 0

Knit directory: MelanomaIMC/

This reproducible R Markdown analysis was created with workflowr (version 1.7.0). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20200728) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version a2860df. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .DS_Store
    Ignored:    .Rproj.user/
    Ignored:    Table_S4.csv
    Ignored:    analysis/.DS_Store
    Ignored:    analysis/._.DS_Store
    Ignored:    code/.DS_Store
    Ignored:    code/._.DS_Store
    Ignored:    data/.DS_Store
    Ignored:    data/._.DS_Store
    Ignored:    data/data_for_analysis/
    Ignored:    data/full_data/

Unstaged changes:
    Modified:   analysis/Figure_5.rmd
    Modified:   analysis/Supp-Figure_12.rmd
    Modified:   analysis/Supp-Figure_13.rmd
    Modified:   analysis/Supp-Figure_5.rmd

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/Summary_Statistics.rmd) and HTML (docs/Summary_Statistics.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
Rmd 3da15db toobiwankenobi 2021-11-24 changes for revision
Rmd e9a4766 toobiwankenobi 2021-07-07 adapt
html 4109ff1 toobiwankenobi 2021-07-07 delete html files and adapt gitignore
Rmd 4affda4 toobiwankenobi 2021-04-14 figure adaptations
Rmd ee1595d toobiwankenobi 2021-02-12 clean repo and adapt files
html ee1595d toobiwankenobi 2021-02-12 clean repo and adapt files
Rmd 2e443a5 toobiwankenobi 2021-02-09 remove files that are not needed
html 3f5af3f toobiwankenobi 2021-02-09 add .html files
Rmd afa7957 toobiwankenobi 2021-02-08 minor changes on figures and figure order
Rmd f9bb33a toobiwankenobi 2021-02-04 new Figure 5 and minor changes in figure order
Rmd 0c52285 toobiwankenobi 2021-01-12 new summary stats
Rmd 2ac1833 toobiwankenobi 2021-01-08 changes to Figures
Rmd 9442cb9 toobiwankenobi 2020-12-22 add all new files

Introduction

This script gives an overview over the clinical data and generates statistics used in the manuscript.

Preparations

Load libraries

sapply(list.files("code/helper_functions", full.names = TRUE), source)
        code/helper_functions/calculateSummary.R
value   ?                                       
visible FALSE                                   
        code/helper_functions/censor_dat.R
value   ?                                 
visible FALSE                             
        code/helper_functions/detect_mRNA_expression.R
value   ?                                             
visible FALSE                                         
        code/helper_functions/DistanceToClusterCenter.R
value   ?                                              
visible FALSE                                          
        code/helper_functions/findMilieu.R code/helper_functions/findPatch.R
value   ?                                  ?                                
visible FALSE                              FALSE                            
        code/helper_functions/getInfoFromString.R
value   ?                                        
visible FALSE                                    
        code/helper_functions/getSpotnumber.R
value   ?                                    
visible FALSE                                
        code/helper_functions/plotCellCounts.R
value   ?                                     
visible FALSE                                 
        code/helper_functions/plotCellFractions.R
value   ?                                        
visible FALSE                                    
        code/helper_functions/plotDist.R code/helper_functions/read_Data.R
value   ?                                ?                                
visible FALSE                            FALSE                            
        code/helper_functions/scatter_function.R
value   ?                                       
visible FALSE                                   
        code/helper_functions/sceChecks.R
value   ?                                
visible FALSE                            
        code/helper_functions/validityChecks.R
value   ?                                     
visible FALSE                                 
library(data.table)
library(dplyr)
library(SingleCellExperiment)
library(readr)

Load Data

# SCE object
sce_prot = readRDS(file = "data/data_for_analysis/sce_protein.rds")
sce_rna = readRDS(file = "data/data_for_analysis/sce_RNA.rds")

# image
image_mat_rna <- read.csv("data/data_for_analysis/rna/Image.csv")
image_mat_prot <- read.csv("data/data_for_analysis/protein/Image.csv")

Statistics

Number of Samples and Patients

# Number of Patients
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(PatientID) %>%
  summarise(n=n())
   n
1 69
# Number of Samples without control samples
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description) %>%
  summarise(n=n())
    n
1 159
# Number of Samples - Mutation
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description, .keep_all = T) %>%
  group_by(Mutation) %>%
  summarise(n=n()) %>%
  mutate(percentage = round(n/sum(n) *100,0))
# A tibble: 6 × 3
  Mutation     n percentage
  <chr>    <int>      <dbl>
1 BRAF        71         45
2 GNAQ         2          1
3 KRAS         1          1
4 NRAS        50         31
5 unknown      7          4
6 wt          28         18
# Number of Samples - Location
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description, .keep_all = T) %>%
  group_by(MM_location_simplified) %>%
  summarise(n=n()) %>%
  mutate(percentage = round(n/sum(n) *100,0))
# A tibble: 3 × 3
  MM_location_simplified     n percentage
  <chr>                  <int>      <dbl>
1 LN                        54         34
2 other                     29         18
3 skin                      76         48

Number of Samples per Patient

# Number of Patients
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description, .keep_all = T) %>%
  group_by(PatientID) %>%
  summarise(n=n()) %>%
  group_by(n) %>%
  summarise(group_sizes = n())
# A tibble: 7 × 2
      n group_sizes
  <int>       <int>
1     1          14
2     2          39
3     3           7
4     4           4
5     5           1
6     6           3
7     7           1

Samples per Location

# Number Controls
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description, .keep_all = T) %>%
  group_by(MM_location) %>%
  summarise(n=n())
# A tibble: 11 × 2
   MM_location           n
   <chr>             <int>
 1 brain                 7
 2 LN                   49
 3 LN or soft tissue     3
 4 mucosal               4
 5 parotis or LN         2
 6 skin                  4
 7 skin_cutaneous       10
 8 skin_subcutaneous    52
 9 skin_undefine        10
10 soft tissue           9
11 visceral              9
# Number Controls
data.frame(colData(sce_prot)) %>%
  filter(Location == "CTRL") %>%
  distinct(Description, .keep_all = T) %>%
  group_by(TissueType) %>%
  summarise(n=n())
# A tibble: 3 × 2
  TissueType     n
  <chr>      <int>
1 Lymphnode      2
2 PSO            2
3 Skin           3

Number of Cells in Data Sets

ncol(sce_rna)
[1] 864263
ncol(sce_prot)
[1] 989404

Number of Cells and Ablated Area

# diff in ablated area
area_prot <- data.frame(image_area = image_mat_prot$Height_FullStack * image_mat_prot$Width_FullStack)
area_prot$Description <- image_mat_prot$Metadata_Description
area_prot$data_set <- "Protein"

area_rna <- data.frame(image_area = image_mat_rna$Height_FullStack * image_mat_rna$Width_FullStack)
area_rna$Description <- image_mat_rna$Metadata_Description
area_rna$data_set <- "RNA"

image_area <- rbind(area_rna, area_prot)

# Ratio #Cells Protein/RNA
round(ncol(sce_prot) / ncol(sce_rna),2)
[1] 1.14
area <- image_area %>%
  group_by(data_set) %>%
  summarise(area_sum = sum(image_area))

# Ratio Area Protein/RNA
round(area[area$data_set == "Protein", ]$area_sum / area[area$data_set == "RNA", ]$area_sum,2)
[1] 1.07

Number of Celltypes

# Protein data
data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage=round(n/sum(n)*100,1))
# A tibble: 11 × 3
   celltype           n percentage
   <chr>          <int>      <dbl>
 1 B cell         39632        4.1
 2 BnT cell       25288        2.6
 3 CD4+ T cell    54188        5.6
 4 CD8+ T cell    52622        5.5
 5 FOXP3+ T cell   9286        1  
 6 Macrophage     62120        6.5
 7 Neutrophil     11081        1.2
 8 pDC             6693        0.7
 9 Stroma         59455        6.2
10 Tumor         622146       64.7
11 unknown        18839        2  
# RNA data
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage=round(n/sum(n)*100,1))
# A tibble: 10 × 3
   celltype         n percentage
   <chr>        <int>      <dbl>
 1 CD38         10931        1.3
 2 CD8- T cell  87858       10.5
 3 CD8+ T cell  44630        5.3
 4 HLA-DR       29557        3.5
 5 Macrophage   64405        7.7
 6 Neutrophil    5018        0.6
 7 Stroma       24574        2.9
 8 Tumor       549153       65.3
 9 unknown       2972        0.4
10 Vasculature  21297        2.5

Number of Chemokine Expressing Cells

# Percentage of Chemokine Producing Cells
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  group_by(chemokine) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
  chemokine      n percentage
  <lgl>      <int>      <dbl>
1 FALSE     782417       93.1
2 TRUE       57978        6.9
# Chemokines by Celltype
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(chemokine == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 10 × 3
   celltype        n percentage
   <chr>       <int>      <dbl>
 1 CD38          920        1.6
 2 CD8- T cell 12179       21  
 3 CD8+ T cell  9428       16.3
 4 HLA-DR       3202        5.5
 5 Macrophage  12675       21.9
 6 Neutrophil   1378        2.4
 7 Stroma       3913        6.7
 8 Tumor       12965       22.4
 9 unknown        45        0.1
10 Vasculature  1273        2.2
# Sum of major expressing cell types
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(chemokine == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1)) %>%
  filter(percentage > 15) %>%
  summarise(sum <- sum(percentage))
# A tibble: 1 × 1
  `sum <- sum(percentage)`
                     <dbl>
1                     81.6
# CXCL13 experssion by Tcells
# Chemokines by Celltype
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(expressor == "CXCL13") %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1)) %>%
  filter(percentage > 30) %>%
  summarise(sum <- sum(percentage))
# A tibble: 1 × 1
  `sum <- sum(percentage)`
                     <dbl>
1                     71.1

Multi Expressors

data.frame(colData(sce_rna)) %>%
  rowwise() %>%
  mutate(number_of_chemokines = length(strsplit(expressor, "_")[[1]])) %>%
  filter(Location != "CTRL") %>%
  filter(chemokine == 1) %>%
  group_by(number_of_chemokines) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 8 × 3
  number_of_chemokines     n percentage
                 <int> <int>      <dbl>
1                    1 45687       78.8
2                    2  9479       16.3
3                    3  2152        3.7
4                    4   518        0.9
5                    5   109        0.2
6                    6    22        0  
7                    7     8        0  
8                    8     3        0  

CCL8 Expression

data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(CCL8 == 1) %>%
  summarise(n=n())
    n
1 862

Chemokine Expression in Tumor Cells

# Percentage of Tumor Cells that Express a Chemokine
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(celltype == "Tumor") %>%
  group_by(chemokine) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
  chemokine      n percentage
  <lgl>      <int>      <dbl>
1 FALSE     536188       97.6
2 TRUE       12965        2.4
# CXCL10 in Tumor cells
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(CXCL10 == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 10 × 3
   celltype        n percentage
   <chr>       <int>      <dbl>
 1 CD38           71        0.6
 2 CD8- T cell  1275       10.7
 3 CD8+ T cell  1364       11.4
 4 HLA-DR        332        2.8
 5 Macrophage   3624       30.3
 6 Neutrophil    166        1.4
 7 Stroma        212        1.8
 8 Tumor        4778       40  
 9 unknown         3        0  
10 Vasculature   117        1  
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(celltype == "Tumor") %>%
  group_by(CXCL10) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
  CXCL10      n percentage
   <dbl>  <int>      <dbl>
1      0 544375       99.1
2      1   4778        0.9
# CCL2 in Tumor cells
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(CCL2 == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 10 × 3
   celltype        n percentage
   <chr>       <int>      <dbl>
 1 CD38          270        2.7
 2 CD8- T cell  1198       11.9
 3 CD8+ T cell   768        7.7
 4 HLA-DR        327        3.3
 5 Macrophage   3041       30.3
 6 Neutrophil     89        0.9
 7 Stroma       1182       11.8
 8 Tumor        2872       28.6
 9 unknown         7        0.1
10 Vasculature   282        2.8
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(celltype == "Tumor") %>%
  group_by(CCL2) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
   CCL2      n percentage
  <dbl>  <int>      <dbl>
1     0 546281       99.5
2     1   2872        0.5
# CXCL8 in Tumor cells
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(CXCL8 == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 10 × 3
   celltype        n percentage
   <chr>       <int>      <dbl>
 1 CD38           18        0.4
 2 CD8- T cell   133        3.1
 3 CD8+ T cell    95        2.2
 4 HLA-DR         53        1.2
 5 Macrophage    641       14.8
 6 Neutrophil   1058       24.4
 7 Stroma         69        1.6
 8 Tumor        2214       51  
 9 unknown        13        0.3
10 Vasculature    46        1.1
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(celltype == "Tumor") %>%
  group_by(CXCL8) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
  CXCL8      n percentage
  <dbl>  <int>      <dbl>
1     0 546939       99.6
2     1   2214        0.4
# CXCL12 in Tumor cells
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(CXCL12 == 1) %>%
  group_by(celltype) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 10 × 3
   celltype        n percentage
   <chr>       <int>      <dbl>
 1 CD38          340        4.3
 2 CD8- T cell  1445       18.3
 3 CD8+ T cell   681        8.6
 4 HLA-DR        255        3.2
 5 Macrophage   1287       16.3
 6 Neutrophil     14        0.2
 7 Stroma       2373       30  
 8 Tumor        1060       13.4
 9 unknown         3        0  
10 Vasculature   453        5.7
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  filter(celltype == "Tumor") %>%
  group_by(CXCL12) %>%
  summarise(n=n()) %>%
  mutate(percentage = round((n / sum(n)) *100,1))
# A tibble: 2 × 3
  CXCL12      n percentage
   <dbl>  <int>      <dbl>
1      0 548093       99.8
2      1   1060        0.2

Chemokine Expression in Locations

# overall chemokine expression
data.frame(colData(sce_rna)) %>%
  filter(Location == "CTRL") %>%
  group_by(chemokine, TissueType) %>%
  summarise(n=n()) %>%
  reshape2::dcast(TissueType ~ chemokine, value.var = "n", fill = 0) %>%
  mutate(percentage_expressing = round(`TRUE` / (`FALSE`+`TRUE`) * 100,1))
  TissueType FALSE TRUE percentage_expressing
1  Lymphnode 16949 1001                   5.6
2        PSO  2524  264                   9.5
3       Skin  3097   33                   1.1
# CXCL13 expression in control samples
data.frame(colData(sce_rna)) %>%
  filter(Location == "CTRL") %>%
  group_by(CXCL13, TissueType) %>%
  summarise(n=n()) %>%
  reshape2::dcast(TissueType ~ CXCL13, value.var = "n", fill = 0) %>%
  mutate(percentage_expressing = round(`1` / (`0`+`1`) * 100,1))
  TissueType     0   1 percentage_expressing
1  Lymphnode 17316 634                   3.5
2        PSO  2787   1                   0.0
3       Skin  3130   0                   0.0
# CXCL13 expression in tumor samples
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  group_by(CXCL13, MM_location) %>%
  summarise(n=n()) %>%
  reshape2::dcast(MM_location ~ CXCL13, value.var = "n", fill = 0) %>%
  mutate(percentage_expressing = round(`1` / (`0`+`1`) * 100,1))
         MM_location      0    1 percentage_expressing
1              brain  28923  922                   3.1
2                 LN 288382 5157                   1.8
3  LN or soft tissue  21060  148                   0.7
4            mucosal  20428   34                   0.2
5      parotis or LN  12698   23                   0.2
6               skin   9656   72                   0.7
7     skin_cutaneous  64397   74                   0.1
8  skin_subcutaneous 268021 1582                   0.6
9      skin_undefine  38163  508                   1.3
10       soft tissue  38483  159                   0.4
11          visceral  41479   26                   0.1
# CXCL10 expression in control samples
data.frame(colData(sce_rna)) %>%
  filter(Location == "CTRL") %>%
  group_by(CXCL10, TissueType) %>%
  summarise(n=n()) %>%
  reshape2::dcast(TissueType ~ CXCL10, value.var = "n", fill = 0) %>%
  mutate(percentage_expressing = round(`1` / (`0`+`1`) * 100,1))
  TissueType     0  1 percentage_expressing
1  Lymphnode 17916 34                   0.2
2        PSO  2782  6                   0.2
3       Skin  3130  0                   0.0
# CXCL10 expression in tumor samples
data.frame(colData(sce_rna)) %>%
  filter(Location != "CTRL") %>%
  group_by(CXCL10, MM_location) %>%
  summarise(n=n()) %>%
  reshape2::dcast(MM_location ~ CXCL10, value.var = "n", fill = 0) %>%
  mutate(percentage_expressing = round(`1` / (`0`+`1`) * 100,1))
         MM_location      0    1 percentage_expressing
1              brain  29336  509                   1.7
2                 LN 289761 3778                   1.3
3  LN or soft tissue  20929  279                   1.3
4            mucosal  20405   57                   0.3
5      parotis or LN  12714    7                   0.1
6               skin   9681   47                   0.5
7     skin_cutaneous  64227  244                   0.4
8  skin_subcutaneous 264588 5015                   1.9
9      skin_undefine  36915 1756                   4.5
10       soft tissue  38399  243                   0.6
11          visceral  41498    7                   0.0

Fisher Test for Bcell patches and Dysfunction

# no control samples
cont_table <- data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL") %>%
  distinct(Description,.keep_all = T) %>%
  filter(is.na(dysfunction_score) == FALSE) %>%
  group_by(bcell_patch_score, dysfunction_score) %>%
  summarise(n=n()) %>%
  filter(bcell_patch_score %in% c("Small B cell Patches", "B cell Follicles")) %>%
  reshape2::dcast(bcell_patch_score ~ dysfunction_score, value.var = "n", fill = 0)

fisher.test(cont_table[,-1])

    Fisher's Exact Test for Count Data

data:  cont_table[, -1]
p-value = 0.01522
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
    1.310455 1242.440939
sample estimates:
odds ratio 
  18.80249 
# no LN samples
cont_table <- data.frame(colData(sce_prot)) %>%
  filter(Location != "CTRL" & MM_location_simplified != "LN") %>%
  distinct(Description,.keep_all = T) %>%
  filter(is.na(dysfunction_score) == FALSE) %>%
  group_by(bcell_patch_score, dysfunction_score) %>%
  summarise(n=n()) %>%
  filter(bcell_patch_score %in% c("Small B cell Patches", "B cell Follicles")) %>%
  reshape2::dcast(bcell_patch_score ~ dysfunction_score, value.var = "n", fill = 0)

fisher.test(cont_table[,-1])

    Fisher's Exact Test for Count Data

data:  cont_table[, -1]
p-value = 0.1667
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.2538029       Inf
sample estimates:
odds ratio 
       Inf 

sessionInfo()
R version 4.1.2 (2021-11-01)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.3 LTS

Matrix products: default
BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.8.so

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       

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

other attached packages:
 [1] readr_2.1.2                 SingleCellExperiment_1.16.0
 [3] SummarizedExperiment_1.24.0 Biobase_2.54.0             
 [5] GenomicRanges_1.46.1        GenomeInfoDb_1.30.1        
 [7] IRanges_2.28.0              S4Vectors_0.32.3           
 [9] BiocGenerics_0.40.0         MatrixGenerics_1.6.0       
[11] matrixStats_0.61.0          data.table_1.14.2          
[13] dplyr_1.0.7                 workflowr_1.7.0            

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.8             lattice_0.20-45        getPass_0.2-2         
 [4] ps_1.6.0               assertthat_0.2.1       rprojroot_2.0.2       
 [7] digest_0.6.29          utf8_1.2.2             plyr_1.8.6            
[10] R6_2.5.1               evaluate_0.14          httr_1.4.2            
[13] pillar_1.7.0           zlibbioc_1.40.0        rlang_1.0.0           
[16] rstudioapi_0.13        whisker_0.4            callr_3.7.0           
[19] jquerylib_0.1.4        Matrix_1.4-0           rmarkdown_2.11        
[22] stringr_1.4.0          RCurl_1.98-1.5         DelayedArray_0.20.0   
[25] compiler_4.1.2         httpuv_1.6.5           xfun_0.29             
[28] pkgconfig_2.0.3        htmltools_0.5.2        tidyselect_1.1.1      
[31] tibble_3.1.6           GenomeInfoDbData_1.2.7 fansi_1.0.2           
[34] tzdb_0.2.0             crayon_1.4.2           later_1.3.0           
[37] bitops_1.0-7           grid_4.1.2             jsonlite_1.7.3        
[40] lifecycle_1.0.1        DBI_1.1.2              git2r_0.29.0          
[43] magrittr_2.0.2         cli_3.1.1              stringi_1.7.6         
[46] reshape2_1.4.4         XVector_0.34.0         fs_1.5.2              
[49] promises_1.2.0.1       bslib_0.3.1            ellipsis_0.3.2        
[52] generics_0.1.2         vctrs_0.3.8            tools_4.1.2           
[55] glue_1.6.1             purrr_0.3.4            hms_1.1.1             
[58] processx_3.5.2         fastmap_1.1.0          yaml_2.2.2            
[61] knitr_1.37             sass_0.4.0