Last updated: 2021-02-04
Checks: 7 0
Knit directory: melanoma_publication_old_data/
This reproducible R Markdown analysis was created with workflowr (version 1.6.2). 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 20a1458. 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: .Rhistory
Ignored: .Rproj.user/
Ignored: ._.DS_Store
Ignored: code/.DS_Store
Ignored: code/._.DS_Store
Ignored: code/helper_functions/._findCommunity.R
Ignored: data/.DS_Store
Ignored: data/._.DS_Store
Ignored: data/._density_infiltration_BlockID.csv
Ignored: data/._layer_1_classification_rna.csv
Ignored: data/._manual_infiltration_scoring.csv
Ignored: data/._manual_infiltration_scoring_BlockID.csv
Ignored: data/._manual_infiltration_scoring_RC.csv
Ignored: data/._manual_infiltration_scoring_TH.csv
Ignored: data/._survdat_for_modelling.csv
Ignored: data/12plex_validation/
Ignored: data/200323_TMA_256_Hot Cold_Clinical Data_Updated Response Data_For Collaborators_latest updated_Mar_2020_for_Coxph_modeling.csv
Ignored: data/colour_vector.rds
Ignored: data/density_infiltration_BlockID.csv
Ignored: data/fraction_and_infiltration_scoring.csv
Ignored: data/layer_1_classification_protein.csv
Ignored: data/layer_1_classification_protein.rds
Ignored: data/layer_1_classification_rna.csv
Ignored: data/manual_infiltration_scoring.csv
Ignored: data/manual_infiltration_scoring_BlockID.csv
Ignored: data/manual_infiltration_scoring_RC.csv
Ignored: data/manual_infiltration_scoring_TH.csv
Ignored: data/protein/
Ignored: data/rna/
Ignored: data/safety_copy_SCE/
Ignored: data/sce_RNA.rds
Ignored: data/sce_protein.rds
Ignored: data/survdat_for_modelling.csv
Ignored: output/.DS_Store
Ignored: output/._.DS_Store
Ignored: output/._protein_neutrophil.png
Ignored: output/._rna_neutrophil.png
Ignored: output/PSOCKclusterOut/
Ignored: output/bcell_grouping.png
Ignored: output/dysfunction_correlation.pdf
Unstaged changes:
Modified: .gitignore
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/04_2_RNA_classification_subclustering.rmd
) and HTML (docs/04_2_RNA_classification_subclustering.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 | 9442cb9 | toobiwankenobi | 2020-12-22 | add all new files |
Rmd | d8819f2 | toobiwankenobi | 2020-10-08 | read new data (nuclei expansion) and adapt scripts |
Rmd | a21c858 | toobiwankenobi | 2020-08-06 | adapt pipeline |
Rmd | 4fc7560 | toobiwankenobi | 2020-08-05 | Update 04_2_RNA_classification_subclustering.rmd |
Rmd | 402481d | toobiwankenobi | 2020-08-05 | Update 04_2_RNA_classification_subclustering.rmd |
Rmd | 8babce7 | toobiwankenobi | 2020-08-05 | update subclustering |
Rmd | f20c4ac | toobiwankenobi | 2020-08-05 | Update 04_2_RNA_classification_subclustering.rmd |
Rmd | 2c11d5c | toobiwankenobi | 2020-08-05 | add new scripts |
Rmd | 73881bb | toobiwankenobi | 2020-07-30 | add code to files from old repo |
Rmd | cf46cfa | toobiwankenobi | 2020-07-28 | create files |
In this script we try to set global thresholds for some key markers (CD3 etc) and then sub-cluster the respective cells with markers that we know are expressed on those cells.
knitr::opts_chunk$set(echo = TRUE, message= FALSE)
knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())
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//findClusters.R
value ?
visible FALSE
code/helper_functions//findCommunity.R
value ?
visible FALSE
code/helper_functions//getCellCount.R
value ?
visible FALSE
code/helper_functions//getInfoFromString.R
value ?
visible FALSE
code/helper_functions//getSpotnumber.R
value ?
visible FALSE
code/helper_functions//plotBarFracCluster.R
value ?
visible FALSE
code/helper_functions//plotCellCounts.R
value ?
visible FALSE
code/helper_functions//plotCellFrac.R
value ?
visible FALSE
code/helper_functions//plotCellFracGroups.R
value ?
visible FALSE
code/helper_functions//plotCellFracGroupsSubset.R
value ?
visible FALSE
code/helper_functions//plotCellFractions.R
value ?
visible FALSE
code/helper_functions//plotDist.R
value ?
visible 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
sapply(list.files("/Volumes/server_homes/daniels/Git/imcRtools/R/", full.names = TRUE), source)
named list()
library(LSD)
library(SingleCellExperiment)
library(ggplot2)
library(scater)
library(viridis)
library(Rphenograph)
library(igraph)
library(CATALYST)
library(workflowr)
library(gridExtra)
library(dplyr)
sce <- readRDS(file = "data/sce_RNA.rds")
# store labels from randomForest separately
sce$celltype_rf <- sce$celltype
# assign superclasses
sce[,sce$celltype_rf %in% c("exhausted Tcytotoxic", "Tcytotoxic")]$celltype <- "Tcytotoxic"
sce[,sce$celltype_rf %in% c("CD134+ Tcell", "CD134- Tcell")]$celltype <- "Tcell"
celltype_color <- vector(length = length(unique(sce$celltype)))
names(celltype_color) <- unique(sce$celltype)
celltype_color["CD38"] <- "gold"
celltype_color["HLA-DR"] <- "darkolivegreen"
celltype_color["Macrophage"] <- "yellow2"
celltype_color["Neutrophil"] <- "thistle"
celltype_color["Tcell"] <- "cyan3"
celltype_color["Vasculature"] <- "sienna1"
celltype_color["Stroma"] <- "tomato"
celltype_color["Tcytotoxic"] <- "deepskyblue"
celltype_color["Tumor"] <- "sienna4"
celltype_color["unknown"] <- "gray88"
# Save in SCE object
metadata(sce)$colour_vectors$celltype <- celltype_color
marker_list <- list()
marker_list$Stroma <- c("SMA", "CK5", "Cadherin11", "FAP","pRB","B2M","GLUT1","T5_CCL4","T7_CCL18","CCR2","T1_CXCL8",
"T4_CXCL10","T8_CXCL13","T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","CD31",
"T10_CCL19","cleavedPARP")
marker_list$Tumor <- c("HLADR", "S100","B2M","GLUT1","PDL1","SOX10","T5_CCL4","T7_CCL18","CCR2","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP",
"Mart1","pRB")
marker_list$Neutrophil <- c("CD15", "PDL1","GLUT1", "MPO","T5_CCL4","T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$Tcell <- c("CD3", "CD8", "PD1", "Lag3", "CCR2","CD38","PDL1", "HLADR", "CD134","T5_CCL4", "B2M", "CD31",
"T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13","T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9",
"T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$Tcytotoxic <- c("CD3", "CD8", "PD1", "Lag3", "CCR2","CD38","PDL1", "HLADR", "CD134","T5_CCL4", "B2M", "CD31",
"T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13","T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9",
"T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$Macrophage <- c("CD68", "CD163", "HLADR", "PDL1", "CD3", "CCR2","T5_CCL4","T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$Vasculature <- c("CD31", "SMA","CK5","pRB", "Cadherin11","T5_CCL4","T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$`HLA-DR` <- c("HLADR","CD68","CD3","CCR2","T5_CCL4","T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$CD38 <- c("HLADR","CD38","CD3","CCR2","CD163","CD68","T5_CCL4","T7_CCL18","T1_CXCL8","T4_CXCL10","T8_CXCL13",
"T3_CXCL12","T12_CCL2","T2_CCL22","T9_CXCL9","T11_CCL8","T10_CCL19","cleavedPARP", "pRB")
marker_list$unknown <- rownames(sce[rowData(sce)$good_marker,])
# check if the names of the marker list match the names of the classified cells
all(names(marker_list) %in% unique(sce$celltype))
[1] TRUE
FlowSOM first because it is faster
## the FlowSOM function from CATALYST needs an another column in the rowData of the sce to work properly:
rowData(sce)$marker_class <- "state"
# vector for clustering
fs_clustering <- vector(length = ncol(sce))
# Macrophage, Tcell, Tcytotoxic, Tumor will be clustered for a total of 6 clustes each
set.seed(12345)
# 6 clusters
for(i in c("Tcell","Macrophage","Tcytotoxic","Tumor")){
#subset cells for clustering
cur_sce <- sce[,sce$celltype == i]
names(assays(cur_sce)) <- c("counts", "exprs","scaled_counts", "scaled_asinh")
cur_sce <- CATALYST::cluster(cur_sce, features = marker_list[i][[1]], ydim = 2, xdim = 3, maxK = 4)
fs_clustering[sce$celltype == i] <- cur_sce$cluster_id
}
# 4 clusters
for(i in c("Neutrophil","CD38","Stroma","Vasculature","HLA-DR", "unknown")){
cur_sce <- sce[,sce$celltype == i]
names(assays(cur_sce)) <- c("counts", "exprs","scaled_counts", "scaled_asinh")
cur_sce <- CATALYST::cluster(cur_sce, features = marker_list[i][[1]], ydim = 2, xdim = 2, maxK = 3)
fs_clustering[sce$celltype == i] <- cur_sce$cluster_id
}
# Save in SCE object
colData(sce)$celltype_clustered <- as.factor(fs_clustering)
sce$celltype_clustered <- paste0(sce$celltype, "_", sce$celltype_clustered)
# Aggregate the counts
mean_sce <- calculateSummary(sce, split_by = c("celltype_clustered", "celltype"),
exprs_values = "counts")
# Exclude bad markers
mean_sce <- mean_sce[rowData(sce)$good_marker,]
# Transform and scale
assay(mean_sce, "arcsinh") <- asinh(assay(mean_sce, "meanCounts"))
assay(mean_sce, "arcsinh_scaled") <- t(scale(t(asinh(assay(mean_sce, "meanCounts")))))
# Scaled
plotHeatmap(mean_sce, exprs_values = "arcsinh_scaled",
colour_columns_by = "celltype",
labels_col = mean_sce$celltype_clustered,
show_colnames = TRUE, annotation_legend = TRUE, borders_color = NA,
color = colorRampPalette(c("dark blue", "white", "dark red"))(100),
zlim = c(-4, 4),legend = TRUE)
celltype_counts <- sce$celltype_clustered
table(celltype_counts)
celltype_counts
CD38_1 CD38_2 CD38_3 CD38_4 HLA-DR_1
1703 2323 3115 4049 13176
HLA-DR_2 HLA-DR_3 HLA-DR_4 Macrophage_1 Macrophage_2
4636 5941 12700 7513 13380
Macrophage_3 Macrophage_4 Macrophage_5 Macrophage_6 Neutrophil_1
11788 13106 8945 10696 622
Neutrophil_2 Neutrophil_3 Neutrophil_4 Stroma_1 Stroma_2
1223 1701 1508 2325 3956
Stroma_3 Stroma_4 Tcell_1 Tcell_2 Tcell_3
7841 10868 24011 14807 13230
Tcell_4 Tcell_5 Tcell_6 Tcytotoxic_1 Tcytotoxic_2
12678 24222 8924 6013 7272
Tcytotoxic_3 Tcytotoxic_4 Tcytotoxic_5 Tcytotoxic_6 Tumor_1
5321 10216 5908 10474 72776
Tumor_2 Tumor_3 Tumor_4 Tumor_5 Tumor_6
94020 69388 89337 108154 119002
unknown_1 unknown_2 unknown_3 unknown_4 Vasculature_1
1869 549 452 313 10360
Vasculature_2 Vasculature_3 Vasculature_4
5568 4860 1424
annotations <- sce$celltype_clustered
# add annotation if wanted
#annotations[annotations == "Tumor_1"] <- "Tumor1_"
#annotations[annotations == "Tumor_2"] <- "Tumor2_"
#annotations[annotations == "Tumor_3"] <- "Tumor3_"
#annotations[annotations == "Tumor_4"] <- "Tumor4_"
#annotations[annotations == "Tumor_5"] <- "Tumor5_"
#annotations[annotations == "Tumor_6"] <- "Tumor6_"
sce$cellAnnotation <- annotations
mean_sce <- calculateSummary(sce, split_by = c("celltype_clustered","celltype"),
exprs_values = "counts")
# Exclude bad markers
mean_sce <- mean_sce[rowData(sce)$good_marker,]
# Transform and scale
assay(mean_sce, "arcsinh") <- asinh(assay(mean_sce, "meanCounts"))
assay(mean_sce, "arcsinh_scaled") <- t(scale(t(asinh(assay(mean_sce, "meanCounts")))))
plotHeatmap(mean_sce, exprs_values = "arcsinh_scaled",
colour_columns_by = c("celltype"),
labels_col = mean_sce$celltype,
show_colnames = TRUE, annotation_legend = TRUE, borders_color = NA,
color = colorRampPalette(c("dark blue", "white", "dark red"))(100),
zlim = c(-4, 4),legend = TRUE)
# Density of Expression in different Tcytotoxic clusters vs. manually gated Lag3+ cells
cur_sce <- data.frame(colData(sce))
cur_exprs <- data.frame(t(assays(sce)[[2]]))
cur_exprs <- cbind(cur_exprs, cur_sce[,c("celltype", "celltype_rf", "celltype_clustered")])
cur_exprs$cellID <- rownames(cur_exprs)
cur_exprs <- cur_exprs %>%
reshape2::melt(id.vars = c("cellID", "celltype", "celltype_rf", "celltype_clustered"),
variable.name = "marker", value.name = "asinh")
# clustering
a <- cur_exprs %>%
filter(celltype == "Tcytotoxic" & marker %in% marker_list$Tcytotoxic) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
# manual gating
b <- cur_exprs %>%
filter(celltype == "Tcytotoxic" & marker %in% marker_list$Tcytotoxic) %>%
ggplot(data=., aes(asinh, color = celltype_rf)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
grid.arrange(a, b, ncol = 2)
Warning: Removed 17847 rows containing non-finite values (stat_density).
Warning: Removed 17847 rows containing non-finite values (stat_density).
Conclusion: if you want to catch REAL biological signal than flowSOM clustering isn’t gonna do it!
# clustering
a <- cur_exprs %>%
filter(celltype == "Tcell" & marker %in% marker_list$Tcell) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
# manual gating
b <- cur_exprs %>%
filter(celltype == "Tcell" & marker %in% marker_list$Tcell) %>%
ggplot(data=., aes(asinh, color = celltype_rf)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
grid.arrange(a, b, ncol = 2)
Warning: Removed 33619 rows containing non-finite values (stat_density).
Warning: Removed 33619 rows containing non-finite values (stat_density).
# clustering
cur_exprs %>%
filter(celltype == "Tumor" & marker %in% marker_list$Tumor) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
Warning: Removed 124307 rows containing non-finite values (stat_density).
# clustering
cur_exprs %>%
filter(celltype == "Neutrophil" & marker %in% marker_list$Neutrophil) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
Warning: Removed 1029 rows containing non-finite values (stat_density).
# clustering
cur_exprs %>%
filter(celltype == "Macrophage" & marker %in% marker_list$Macrophage) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
Warning: Removed 47900 rows containing non-finite values (stat_density).
# clustering
cur_exprs %>%
filter(celltype == "CD38" & marker %in% marker_list$CD38) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
Warning: Removed 2477 rows containing non-finite values (stat_density).
# clustering
cur_exprs %>%
filter(celltype == "unknown" & marker %in% marker_list$unknown) %>%
ggplot(data=., aes(asinh, color = celltype_clustered)) +
geom_density() +
xlim(0,4) +
facet_wrap(~marker)
Warning: Removed 36 rows containing non-finite values (stat_density).
saveRDS(sce, "data/sce_RNA.rds")
sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04 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=C
[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] parallel stats4 stats graphics grDevices utils datasets
[8] methods base
other attached packages:
[1] dplyr_1.0.2 gridExtra_2.3
[3] CATALYST_1.12.2 igraph_1.2.6
[5] Rphenograph_0.99.1.9003 viridis_0.5.1
[7] viridisLite_0.3.0 scater_1.16.2
[9] ggplot2_3.3.3 SingleCellExperiment_1.12.0
[11] SummarizedExperiment_1.20.0 Biobase_2.50.0
[13] GenomicRanges_1.42.0 GenomeInfoDb_1.26.2
[15] IRanges_2.24.1 S4Vectors_0.28.1
[17] BiocGenerics_0.36.0 MatrixGenerics_1.2.0
[19] matrixStats_0.57.0 LSD_4.1-0
[21] workflowr_1.6.2
loaded via a namespace (and not attached):
[1] readxl_1.3.1 circlize_0.4.12
[3] drc_3.0-1 plyr_1.8.6
[5] ConsensusClusterPlus_1.52.0 splines_4.0.3
[7] flowCore_2.0.1 BiocParallel_1.22.0
[9] TH.data_1.0-10 digest_0.6.27
[11] htmltools_0.5.0 magrittr_2.0.1
[13] CytoML_2.0.5 cluster_2.1.0
[15] openxlsx_4.2.3 ComplexHeatmap_2.4.3
[17] RcppParallel_5.0.2 sandwich_3.0-0
[19] flowWorkspace_4.0.6 cytolib_2.0.3
[21] jpeg_0.1-8.1 colorspace_2.0-0
[23] ggrepel_0.9.0 haven_2.3.1
[25] xfun_0.20 crayon_1.3.4
[27] RCurl_1.98-1.2 jsonlite_1.7.2
[29] hexbin_1.28.2 graph_1.66.0
[31] survival_3.2-7 zoo_1.8-8
[33] glue_1.4.2 gtable_0.3.0
[35] nnls_1.4 zlibbioc_1.36.0
[37] XVector_0.30.0 GetoptLong_1.0.5
[39] DelayedArray_0.16.0 ggcyto_1.16.0
[41] car_3.0-10 BiocSingular_1.4.0
[43] Rgraphviz_2.32.0 shape_1.4.5
[45] abind_1.4-5 scales_1.1.1
[47] pheatmap_1.0.12 mvtnorm_1.1-1
[49] Rcpp_1.0.5 plotrix_3.7-8
[51] clue_0.3-58 foreign_0.8-81
[53] rsvd_1.0.3 FlowSOM_1.20.0
[55] tsne_0.1-3 RColorBrewer_1.1-2
[57] ellipsis_0.3.1 farver_2.0.3
[59] pkgconfig_2.0.3 XML_3.99-0.5
[61] labeling_0.4.2 reshape2_1.4.4
[63] tidyselect_1.1.0 rlang_0.4.10
[65] later_1.1.0.1 munsell_0.5.0
[67] cellranger_1.1.0 tools_4.0.3
[69] generics_0.1.0 ggridges_0.5.3
[71] evaluate_0.14 stringr_1.4.0
[73] yaml_2.2.1 knitr_1.30
[75] fs_1.5.0 zip_2.1.1
[77] purrr_0.3.4 RANN_2.6.1
[79] RBGL_1.64.0 whisker_0.4
[81] xml2_1.3.2 compiler_4.0.3
[83] rstudioapi_0.13 beeswarm_0.2.3
[85] curl_4.3 png_0.1-7
[87] tibble_3.0.4 stringi_1.5.3
[89] forcats_0.5.0 lattice_0.20-41
[91] Matrix_1.3-2 vctrs_0.3.6
[93] pillar_1.4.7 lifecycle_0.2.0
[95] GlobalOptions_0.1.2 BiocNeighbors_1.6.0
[97] data.table_1.13.6 cowplot_1.1.1
[99] bitops_1.0-6 irlba_2.3.3
[101] httpuv_1.5.4 R6_2.5.0
[103] latticeExtra_0.6-29 promises_1.1.1
[105] RProtoBufLib_2.0.0 rio_0.5.16
[107] vipor_0.4.5 codetools_0.2-18
[109] MASS_7.3-53 gtools_3.8.2
[111] rprojroot_2.0.2 rjson_0.2.20
[113] withr_2.3.0 multcomp_1.4-15
[115] GenomeInfoDbData_1.2.4 hms_0.5.3
[117] ncdfFlow_2.34.0 grid_4.0.3
[119] rmarkdown_2.6 DelayedMatrixStats_1.10.1
[121] carData_3.0-4 Rtsne_0.15
[123] git2r_0.28.0 base64enc_0.1-3
[125] ggbeeswarm_0.6.0