Single-cell transcriptomes of human blastoids generated by Yanagida et al., 2021

Jialei Duan

2022-01-24



Yanagida, A., Spindlow, D., Nichols, J., Dattani, A., Smith, A., and Guo, G. (2021). Naive stem cell blastocyst model captures human embryo lineage segregation. Cell Stem Cell 28, 1016–1022.e4.

  • BioProject Accession: PRJNA720968
  • GEO Accession: GSE171820



Load required packages.

[1] "2022-01-24 16:29:12 CST"

Data preparation

Functions loading

source(
    file = file.path(
        SCRIPT_DIR,
        "utilities.R"
    )
)

Data loading

PROJECT_DIR <- "/Users/jialei/Dropbox/Data/Projects/UTSW/Peri-implantation"

Matrix

ad <- reticulate::import(module = "anndata", convert = TRUE)
print(ad$`__version__`)
[1] "0.7.6"
adata_files <- purrr::map(c("PRJNA720968"), \(x) {
    file.path(
        PROJECT_DIR,
        "raw",
        "public",
        x,
        "matrix",
        "adata.h5ad"
    )
})
purrr::map_lgl(adata_files, file.exists)
[1] TRUE
BACKED <- NULL
matrix_readcount_use <- purrr::map(adata_files, function(x) {
    ad$read_h5ad(
        filename = x, backed = BACKED
    ) |>
        convert_adata()
}) |>
    purrr::reduce(cbind)

matrix_readcount_use |> dim()
[1] 33538   495

Embedding

EMBEDDING_FILE <- "embedding_ncomponents15_ccc1_seed20210719.csv.gz"

embedding <- vroom::vroom(
    file = file.path(
        PROJECT_DIR,
        "raw/public/PRJNA720968",
        "clustering/PRJNA720968/exploring",
        "Scanpy_Harmony_2batches",
        EMBEDDING_FILE
    )
)

embedding |> head() |> knitr::kable()
cell batch louvain leiden x_tsne y_tsne x_fitsne y_fitsne x_umap_min_dist=0.5 y_umap_min_dist=0.5 x_umap_min_dist=0.1 y_umap_min_dist=0.1 x_phate y_phate x_pacmap y_pacmap
GSM5234744 NA 0 2 7.242309 -12.512821 -1.952768 2.387407 6.3454080 7.973671 6.471455 6.6839929 -0.0221856 0.0038625 12.644343 -1.755934
GSM5234745 NA 1 7 16.029781 3.202589 4.077884 20.496506 3.3925710 4.460842 2.176941 5.6017890 -0.0019277 0.0039803 16.730646 -2.930145
GSM5234746 NA 1 2 1.688119 -9.728956 -4.528189 1.067349 6.7724795 6.335969 6.209920 5.6141768 -0.0243982 0.0049713 13.994924 -2.496070
GSM5234747 NA 1 2 22.322464 3.130961 5.642826 12.368830 3.8178000 5.929975 4.304469 6.4326148 0.0169830 0.0001892 15.122799 -2.661770
GSM5234748 NA 2 1 27.696249 21.690281 24.876318 28.604160 -0.6713522 4.234682 -1.068493 4.9413905 0.0385696 -0.0053330 -19.663921 -15.156654
GSM5234749 NA 3 0 -23.088488 -2.237011 3.598484 -27.333997 12.3851538 4.807675 8.015325 0.8049933 0.0243418 -0.0042199 -6.117634 12.861273

Metadata

BACKED <- "r"
cell_metadata <- purrr::map(adata_files, function(x) {
    ad$read_h5ad(
        filename = x, backed = BACKED
    )$obs |>
        tibble::rownames_to_column(var = "cell") |>
        dplyr::select(cell, everything())
}) |>
    dplyr::bind_rows() |>
    dplyr::select(-batch)

cell_metadata |> head() |> knitr::kable()
cell num_umis num_features mt_percentage
GSM5234744 8204417 6873 0.0321321
GSM5234745 1022327 9561 0.0459491
GSM5234746 1588932 6761 0.1335784
GSM5234747 6359789 8078 0.2219017
GSM5234748 9677194 10090 0.0838952
GSM5234749 7426256 11928 0.0329500
cell_metadata_PRJNA720968 <- vroom::vroom(
    file = file.path(
        PROJECT_DIR,
        "raw",
        "public",
        "PRJNA720968",
        "matrix/cell_metadata.csv"
    )
) |>
    dplyr::mutate(
        lineage = factor(
            lineage,
        ),
        origin = factor(
            origin
        ),
        developmental_stage = factor(
            developmental_stage
        )
    )

cell_metadata_PRJNA720968 |>
    dplyr::count(origin, name = "num_cells") |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    )
origin num_cells
Blastocyst 228
Blastoid 267
Sum 495


Check memory usage.

purrr::walk(list(matrix_readcount_use, cell_metadata_PRJNA720968), function(x) {
    print(object.size(x), units = "auto", standard = "SI")
})
57.9 MB
86.8 kB

Clustering of human blastoids

cell_metadata_PRJNA720968 <- cell_metadata_PRJNA720968 |>
    dplyr::mutate(
        annotated = paste(origin, lineage, sep = ": "),
        annotated = factor(
            annotated,
            levels = c(
                "Blastocyst: Epiblast",
                "Blastocyst: Hypoblast",
                "Blastocyst: Inner Cell Mass",
                "Blastocyst: Inner Cell Mass-Trophectoderm Transition",
                "Blastocyst: Early Trophectoderm",
                "Blastocyst: Trophectoderm",
                "Blastocyst: Unknown",
                "Blastoid: Epiblast",
                "Blastoid: Hypoblast",
                "Blastoid: Transitioning",
                "Blastoid: Trophectoderm"
            )
        )
    )
embedding |>
    dplyr::left_join(
        cell_metadata |>
            dplyr::select(cell, num_umis:mt_percentage)
    ) |>
    dplyr::left_join(
        cell_metadata_PRJNA720968
    ) |>
    dplyr::group_by(
        origin
    ) |>
    dplyr::summarise(
        num_cells = dplyr::n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c("median_umis", "median_features", "median_mt_percentage"),
        fns = list(
            Median = ~ median(.)
        ),
        decimals = 2
    )
origin num_cells median_umis median_features median_mt_percentage
Blastocyst 228 7781726 9003 0.06319315
Blastoid 267 7579396 9576 0.03904364
Sum 495
Median 7,680,561.25 9,289.50 0.05

Visualization

x_column <- "x_umap_min_dist=0.1"
y_column <- "y_umap_min_dist=0.1"

GEOM_POINT_SIZE <- 1.25
EMBEDDING_TITLE_PREFIX <- "UMAP"
RASTERISED <- TRUE

Clustering

p_embedding_leiden <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$leiden |> as.factor(),
    label = paste(EMBEDDING_TITLE_PREFIX, "Leiden", sep = "; "),
    label_position = NULL,
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    rasterise = RASTERISED
) +
    theme_customized()

# CB_POSITION <- c(0.8, 0.995)
p_embedding_UMI <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding |>
        dplyr::left_join(
            cell_metadata
        ) |>
        dplyr::pull(num_umis) |>
        {
            \(x) log10(x)
        }(),
    label = paste(EMBEDDING_TITLE_PREFIX, "UMI", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    shuffle_values = FALSE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        legend_key_size = 2,
        legend_text_size = 5
    )

p_embedding_MT <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding |>
        dplyr::left_join(cell_metadata) |>
        dplyr::pull(mt_percentage),
    label = paste(EMBEDDING_TITLE_PREFIX, "MT %", sep = "; "),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    shuffle_values = FALSE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        legend_key_size = 2,
        legend_text_size = 5
    )

selected_feature <- "ENSG00000204531_POU5F1"
p_embedding_POU5F1 <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = log10(calc_cpm(matrix_readcount_use)[selected_feature, embedding$cell] + 1),
    label = glue::glue("{EMBEDDING_TITLE_PREFIX}; {selected_feature}"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    geom_point_alpha = 1,
    sort_values = TRUE,
    shuffle_values = FALSE,
    label_size = 2.5,
    label_hjust = 0,
    label_vjust = 0,
    rasterise = FALSE,
    legend_size = 2,
    legend_ncol = 1
) +
    theme_customized(
        legend_key_size = 2,
        legend_text_size = 5
    )


Clustering of 495 Smart-seq2 single cells.

purrr::reduce(
    list(
        p_embedding_leiden,
        p_embedding_UMI,
        p_embedding_MT,
        p_embedding_POU5F1
    ),
    `+`
) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

Origin & developmental stage

p_embedding_origin <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding |>
        dplyr::left_join(cell_metadata_PRJNA720968) |>
        dplyr::pull(origin),
    label = glue::glue("{EMBEDDING_TITLE_PREFIX}; Origin"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        legend_key_size = 2,
        legend_text_size = 5
    )

p_embedding_developmental_stage <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding |>
        dplyr::left_join(cell_metadata_PRJNA720968) |>
        dplyr::pull(developmental_stage),
    label = glue::glue("{EMBEDDING_TITLE_PREFIX}; Developmental stage"),
    label_position = NULL,
    show_color_value_labels = FALSE,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    shuffle_values = TRUE,
    rasterise = RASTERISED,
    legend_size = 2
) +
    theme_customized(
        legend_key_size = 2,
        legend_text_size = 5
    )
purrr::reduce(
    list(
        p_embedding_origin,
        p_embedding_developmental_stage
    ),
    `+`
) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

Developmental stage

embedding |>
    dplyr::left_join(
        cell_metadata
    ) |>
    dplyr::left_join(cell_metadata_PRJNA720968) |>
    dplyr::group_by(developmental_stage, origin) |>
    dplyr::summarise(
        num_cells = dplyr::n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "median") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c("median_umis", "median_features", "median_mt_percentage"),
        fns = list(
            Median = ~ median(.)
        ),
        decimals = 2
    )
origin num_cells median_umis median_features median_mt_percentage
Day3
Blastoid 159 7329571 9462.0 0.03540585
Day4
Blastoid 108 7685250 9759.0 0.04054943
Day5
Blastocyst 68 7692114 8909.0 0.07377675
Day6
Blastocyst 80 6475820 8393.5 0.05267877
Day7
Blastocyst 80 8645422 9454.0 0.06118594
Sum 495
Median 7,685,250.00 9,454.00 0.05


purrr::map(levels(cell_metadata_PRJNA720968$developmental_stage), \(x) {
    plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = embedding |>
            dplyr::left_join(cell_metadata_PRJNA720968) |>
            dplyr::mutate(
                value = dplyr::case_when(
                    developmental_stage == x ~ "1",
                    TRUE ~ "0"
                ),
                value = factor(value)
            ) |>
            dplyr::pull(value),
        label = glue::glue("{EMBEDDING_TITLE_PREFIX}; {x}"),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = FALSE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        theme_customized(
            legend_key_size = 2,
            legend_text_size = 5
        ) +
        scale_color_manual(
            values = c("grey70", "salmon")
        )
}) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

Lineage

embedding |>
    dplyr::left_join(
        cell_metadata
    ) |>
    dplyr::left_join(cell_metadata_PRJNA720968) |>
    dplyr::group_by(annotated) |>
    dplyr::summarise(
        num_cells = dplyr::n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_percentage = median(mt_percentage)
    ) |>
    dplyr::rename(lineage = annotated) |>
    gt::gt() |>
    gt::tab_options(table.font.size = "90%") |>
    gt::summary_rows(
        columns = c(num_cells),
        fns = list(
            Sum = ~ sum(.)
        ),
        decimals = 0
    ) |>
    gt::summary_rows(
        columns = c("median_umis", "median_features", "median_mt_percentage"),
        fns = list(
            Median = ~ median(.)
        ),
        decimals = 2
    )
lineage num_cells median_umis median_features median_mt_percentage
Blastocyst: Epiblast 31 8126430 9951.0 0.052335040
Blastocyst: Hypoblast 14 9776420 9619.5 0.049162825
Blastocyst: Inner Cell Mass 22 7335337 9136.5 0.071956141
Blastocyst: Inner Cell Mass-Trophectoderm Transition 23 8187758 8853.0 0.079507155
Blastocyst: Early Trophectoderm 18 8361592 8773.0 0.072238465
Blastocyst: Trophectoderm 117 7541800 8597.0 0.060103082
Blastocyst: Unknown 3 4890522 10178.0 0.060837473
Blastoid: Epiblast 73 7916385 9707.0 0.034658941
Blastoid: Hypoblast 13 8166701 9573.0 0.009467274
Blastoid: Transitioning 7 4276121 8903.0 0.001258322
Blastoid: Trophectoderm 174 7467628 9562.5 0.043218885
Sum 495
Median 7,916,385.00 9,562.50 0.05


purrr::map(levels(cell_metadata_PRJNA720968$annotated), \(x) {
    plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = embedding |>
            dplyr::left_join(cell_metadata_PRJNA720968) |>
            dplyr::mutate(
                value = dplyr::case_when(
                    annotated == x ~ "1",
                    TRUE ~ "0"
                ),
                value = factor(value)
            ) |>
            dplyr::pull(value),
        label = glue::glue("{EMBEDDING_TITLE_PREFIX}; {x}"),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = FALSE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        theme_customized(
            legend_key_size = 2,
            legend_text_size = 5
        ) +
        scale_color_manual(
            values = c("grey70", "salmon")
        )
}) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

Composition

p_barplot_composition_batch <- calc_group_composition(
    data = embedding |>
        dplyr::left_join(
            cell_metadata_PRJNA720968
        ),
    x = "leiden",
    group = "origin"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "origin",
        legend_ncol = 1
    )

p_barplot_composition_annotated <- calc_group_composition(
    data = embedding |>
        dplyr::left_join(
            cell_metadata_PRJNA720968
        ),
    x = "leiden",
    group = "annotated"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "annotated",
        legend_ncol = 1
    )


p_barplot_composition_lineage <- calc_group_composition(
    data = embedding |>
        dplyr::left_join(
            cell_metadata_PRJNA720968
        ),
    x = "leiden",
    group = "lineage"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "lineage",
        legend_ncol = 1
    )

p_barplot_composition_developmental_stage <- calc_group_composition(
    data = embedding |>
        dplyr::left_join(
            cell_metadata_PRJNA720968
        ),
    x = "leiden",
    group = "developmental_stage"
) |>
    dplyr::mutate(
        leiden = factor(leiden)
    ) |>
    plot_barplot(
        x = "leiden",
        y = "percentage",
        z = "developmental_stage",
        legend_ncol = 1
    )

list(
    p_barplot_composition_batch,
    p_barplot_composition_annotated,
    p_barplot_composition_lineage,
    p_barplot_composition_developmental_stage
) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 1, guides = "collect") +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

Expression


Genes used in Fig. 2C.

FEATURES_SELECTED <- c(
    "ENSG00000204531_POU5F1",
    "ENSG00000111704_NANOG",
    "ENSG00000171872_KLF17",
    "ENSG00000186103_ARGFX",
    #
    "ENSG00000164736_SOX17",
    "ENSG00000125798_FOXA2",
    "ENSG00000136574_GATA4",
    "ENSG00000134853_PDGFRA",
    #
    "ENSG00000179348_GATA2",
    "ENSG00000070915_SLC12A3",
    "ENSG00000165556_CDX2",
    "ENSG00000007866_TEAD3"
)
purrr::map(FEATURES_SELECTED, function(x) {
    selected_feature <- x

    cat(selected_feature, "\n")
    values <- log10(calc_cpm(matrix_readcount_use[, embedding$cell])[selected_feature, ] + 1)
    values[embedding |>
        dplyr::left_join(cell_metadata_PRJNA720968) |>
        dplyr::pull(origin) == "Blastocyst"] <- NA

    p1 <- plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = values,
        label = paste(
            EMBEDDING_TITLE_PREFIX,
            "Blastoid",
            selected_feature |> stringr::str_remove(pattern = "^E.+_"),
            sep = "; "
        ),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        shuffle_values = FALSE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        scale_color_viridis_c(
            na.value = "grey80"
        ) +
        theme_customized(
            legend_key_size = 2,
            legend_text_size = 5
        )

    values <- log10(calc_cpm(matrix_readcount_use[, embedding$cell])[selected_feature, ] + 1)
    values[embedding |>
        dplyr::left_join(cell_metadata_PRJNA720968) |>
        dplyr::pull(origin) == "Blastoid"] <- NA

    p2 <- plot_embedding(
        embedding = embedding[, c(x_column, y_column)],
        color_values = values,
        label = paste(
            EMBEDDING_TITLE_PREFIX,
            "Blastocyst",
            selected_feature |> stringr::str_remove(pattern = "^E.+_"),
            sep = "; "
        ),
        label_position = NULL,
        show_color_value_labels = FALSE,
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        shuffle_values = FALSE,
        rasterise = RASTERISED,
        legend_size = 2
    ) +
        scale_color_viridis_c(
            na.value = "grey80"
        ) +
        theme_customized(
            legend_key_size = 2,
            legend_text_size = 5
        )
    return(list(p1, p2))
}) |>
    unlist(recursive = FALSE) |>
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 4) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )
ENSG00000204531_POU5F1 
ENSG00000111704_NANOG 
ENSG00000171872_KLF17 
ENSG00000186103_ARGFX 
ENSG00000164736_SOX17 
ENSG00000125798_FOXA2 
ENSG00000136574_GATA4 
ENSG00000134853_PDGFRA 
ENSG00000179348_GATA2 
ENSG00000070915_SLC12A3 
ENSG00000165556_CDX2 
ENSG00000007866_TEAD3 


R session info

devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.1.2 (2021-11-01)
 os       macOS Monterey 12.1
 system   aarch64, darwin20.6.0
 ui       unknown
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       America/Chicago
 date     2022-01-24
 pandoc   2.17.0.1 @ /opt/homebrew/bin/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package       * version     date (UTC) lib source
 assertthat      0.2.1       2019-03-21 [1] CRAN (R 4.1.1)
 backports       1.4.1       2021-12-13 [1] CRAN (R 4.1.2)
 beeswarm        0.4.0       2021-06-01 [1] CRAN (R 4.1.2)
 bit             4.0.4       2020-08-04 [1] CRAN (R 4.1.1)
 bit64           4.0.5       2020-08-30 [1] CRAN (R 4.1.1)
 brio            1.1.3       2021-11-30 [1] CRAN (R 4.1.2)
 broom           0.7.11      2022-01-03 [1] CRAN (R 4.1.2)
 cachem          1.0.6       2021-08-19 [1] CRAN (R 4.1.1)
 callr           3.7.0       2021-04-20 [1] CRAN (R 4.1.1)
 cellranger      1.1.0       2016-07-27 [1] CRAN (R 4.1.1)
 checkmate       2.0.0       2020-02-06 [1] CRAN (R 4.1.1)
 cli             3.1.1       2022-01-20 [1] CRAN (R 4.1.2)
 colorspace      2.0-2       2021-06-24 [1] CRAN (R 4.1.1)
 crayon          1.4.2       2021-10-29 [1] CRAN (R 4.1.1)
 data.table      1.14.2      2021-09-27 [1] CRAN (R 4.1.1)
 DBI             1.1.2       2021-12-20 [1] CRAN (R 4.1.2)
 dbplyr          2.1.1       2021-04-06 [1] CRAN (R 4.1.1)
 desc            1.4.0       2021-09-28 [1] CRAN (R 4.1.1)
 devtools        2.4.3.9000  2022-01-22 [1] Github (r-lib/devtools@41280ac)
 digest          0.6.29      2021-12-01 [1] CRAN (R 4.1.2)
 dplyr         * 1.0.7.9000  2022-01-12 [1] Github (tidyverse/dplyr@0501335)
 dtplyr          1.2.1       2022-01-19 [1] CRAN (R 4.1.2)
 ellipsis        0.3.2       2021-04-29 [1] CRAN (R 4.1.1)
 evaluate        0.14        2019-05-28 [1] CRAN (R 4.1.1)
 extrafont     * 0.17        2014-12-08 [1] CRAN (R 4.1.1)
 extrafontdb     1.0         2012-06-11 [1] CRAN (R 4.1.1)
 fansi           1.0.2       2022-01-14 [1] CRAN (R 4.1.2)
 farver          2.1.0       2021-02-28 [1] CRAN (R 4.1.1)
 fastmap         1.1.0       2021-01-25 [1] CRAN (R 4.1.1)
 forcats       * 0.5.1.9000  2021-11-29 [1] Github (tidyverse/forcats@b4dade0)
 fs              1.5.2.9000  2021-12-09 [1] Github (r-lib/fs@6d1182f)
 gargle          1.2.0       2021-07-02 [1] CRAN (R 4.1.1)
 generics        0.1.1       2021-10-25 [1] CRAN (R 4.1.1)
 ggbeeswarm      0.6.0       2017-08-07 [1] CRAN (R 4.1.2)
 ggplot2       * 3.3.5       2021-06-25 [1] CRAN (R 4.1.1)
 ggrastr         1.0.1       2021-12-08 [1] Github (VPetukhov/ggrastr@7aed9af)
 glue            1.6.1.9000  2022-01-23 [1] Github (tidyverse/glue@3da70df)
 googledrive     2.0.0       2021-07-08 [1] CRAN (R 4.1.1)
 googlesheets4   1.0.0       2021-07-21 [1] CRAN (R 4.1.1)
 gt              0.3.1.9000  2022-01-17 [1] Github (rstudio/gt@fcabb41)
 gtable          0.3.0.9000  2021-10-28 [1] Github (r-lib/gtable@a0bd272)
 haven           2.4.3       2021-08-04 [1] CRAN (R 4.1.1)
 highr           0.9         2021-04-16 [1] CRAN (R 4.1.1)
 hms             1.1.1       2021-09-26 [1] CRAN (R 4.1.1)
 htmltools       0.5.2       2021-08-25 [1] CRAN (R 4.1.1)
 htmlwidgets     1.5.4       2021-09-08 [1] CRAN (R 4.1.1)
 httr            1.4.2       2020-07-20 [1] CRAN (R 4.1.1)
 jsonlite        1.7.3       2022-01-17 [1] CRAN (R 4.1.2)
 knitr           1.37.1      2021-12-21 [1] https://yihui.r-universe.dev (R 4.1.2)
 labeling        0.4.2       2020-10-20 [1] CRAN (R 4.1.1)
 lattice         0.20-45     2021-09-22 [2] CRAN (R 4.1.2)
 lifecycle       1.0.1       2021-09-24 [1] CRAN (R 4.1.1)
 lubridate       1.8.0       2022-01-20 [1] Github (tidyverse/lubridate@566590f)
 magrittr        2.0.1       2020-11-17 [1] CRAN (R 4.1.1)
 Matrix        * 1.4-0       2021-12-08 [2] CRAN (R 4.1.2)
 memoise         2.0.1       2021-11-26 [1] CRAN (R 4.1.2)
 modelr          0.1.8.9000  2021-10-27 [1] Github (tidyverse/modelr@16168e0)
 munsell         0.5.0       2018-06-12 [1] CRAN (R 4.1.1)
 patchwork     * 1.1.0.9000  2021-10-27 [1] Github (thomasp85/patchwork@79223d3)
 pillar          1.6.4       2021-10-18 [1] CRAN (R 4.1.1)
 pkgbuild        1.3.1       2021-12-20 [1] CRAN (R 4.1.2)
 pkgconfig       2.0.3       2019-09-22 [1] CRAN (R 4.1.1)
 pkgload         1.2.4       2021-11-30 [1] CRAN (R 4.1.2)
 png             0.1-7       2013-12-03 [1] CRAN (R 4.1.1)
 prettyunits     1.1.1       2020-01-24 [1] CRAN (R 4.1.1)
 processx        3.5.2       2021-04-30 [1] CRAN (R 4.1.1)
 ps              1.6.0       2021-02-28 [1] CRAN (R 4.1.1)
 purrr         * 0.3.4       2020-04-17 [1] CRAN (R 4.1.1)
 R.cache         0.15.0      2021-04-30 [1] CRAN (R 4.1.1)
 R.methodsS3     1.8.1       2020-08-26 [1] CRAN (R 4.1.1)
 R.oo            1.24.0      2020-08-26 [1] CRAN (R 4.1.1)
 R.utils         2.11.0      2021-09-26 [1] CRAN (R 4.1.1)
 R6              2.5.1.9000  2021-12-09 [1] Github (r-lib/R6@1b05b89)
 ragg            1.2.1.9000  2021-12-08 [1] Github (r-lib/ragg@c68c666)
 Rcpp            1.0.8       2022-01-13 [1] CRAN (R 4.1.2)
 readr         * 2.1.1       2021-11-30 [1] CRAN (R 4.1.2)
 readxl          1.3.1.9000  2022-01-20 [1] Github (tidyverse/readxl@2ccb82c)
 remotes         2.4.2       2022-01-24 [1] Github (r-lib/remotes@7b0ee01)
 reprex          2.0.1       2021-08-05 [1] CRAN (R 4.1.1)
 reticulate      1.23        2022-01-14 [1] CRAN (R 4.1.2)
 rlang           1.0.0       2022-01-20 [1] Github (r-lib/rlang@f2fbaad)
 rmarkdown       2.11.12     2022-01-24 [1] Github (rstudio/rmarkdown@b53a7ce)
 rprojroot       2.0.2       2020-11-15 [1] CRAN (R 4.1.1)
 rstudioapi      0.13.0-9000 2022-01-15 [1] Github (rstudio/rstudioapi@5d0f087)
 Rttf2pt1        1.3.9       2021-07-22 [1] CRAN (R 4.1.1)
 rvest           1.0.2       2021-10-16 [1] CRAN (R 4.1.1)
 sass            0.4.0       2021-05-12 [1] CRAN (R 4.1.1)
 scales          1.1.1       2020-05-11 [1] CRAN (R 4.1.1)
 sessioninfo     1.2.2       2021-12-06 [1] CRAN (R 4.1.2)
 stringi         1.7.6       2021-11-29 [1] CRAN (R 4.1.2)
 stringr       * 1.4.0.9000  2022-01-24 [1] Github (tidyverse/stringr@85f6140)
 styler        * 1.6.2.9000  2022-01-17 [1] Github (r-lib/styler@9274aed)
 systemfonts     1.0.3.9000  2021-12-07 [1] Github (r-lib/systemfonts@414114e)
 testthat        3.1.2.9000  2022-01-21 [1] Github (r-lib/testthat@54b9db2)
 textshaping     0.3.6       2021-10-13 [1] CRAN (R 4.1.1)
 tibble        * 3.1.6.9000  2022-01-18 [1] Github (tidyverse/tibble@7aa54e6)
 tidyr         * 1.1.4       2021-09-27 [1] CRAN (R 4.1.1)
 tidyselect      1.1.1       2021-04-30 [1] CRAN (R 4.1.1)
 tidyverse     * 1.3.1.9000  2021-12-08 [1] Github (tidyverse/tidyverse@6186fbf)
 tzdb            0.2.0       2021-10-27 [1] CRAN (R 4.1.1)
 usethis         2.1.5.9000  2022-01-20 [1] Github (r-lib/usethis@57b109a)
 utf8            1.2.2       2021-07-24 [1] CRAN (R 4.1.1)
 vctrs           0.3.8       2021-04-29 [1] CRAN (R 4.1.1)
 vipor           0.4.5       2017-03-22 [1] CRAN (R 4.1.2)
 viridisLite     0.4.0       2021-04-13 [1] CRAN (R 4.1.1)
 vroom           1.5.7       2021-11-30 [1] CRAN (R 4.1.2)
 withr           2.4.3       2021-11-30 [1] CRAN (R 4.1.2)
 xfun            0.29        2021-12-14 [1] CRAN (R 4.1.2)
 xml2            1.3.3       2021-11-30 [1] CRAN (R 4.1.2)
 yaml            2.2.1       2020-02-01 [1] CRAN (R 4.1.1)

 [1] /opt/homebrew/lib/R/4.1/site-library
 [2] /opt/homebrew/Cellar/r/4.1.2/lib/R/library

─ Python configuration ───────────────────────────────────────────────────────
 python:         /Users/jialei/.pyenv/shims/python
 libpython:      /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/libpython3.9.dylib
 pythonhome:     /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5:/Users/jialei/.pyenv/versions/miniforge3-4.10.1-5
 version:        3.9.5 | packaged by conda-forge | (default, Jun 19 2021, 00:24:55)  [Clang 11.1.0 ]
 numpy:          /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/python3.9/site-packages/numpy
 numpy_version:  1.20.3
 anndata:        /Users/jialei/.pyenv/versions/miniforge3-4.10.1-5/lib/python3.9/site-packages/anndata
 
 NOTE: Python version was forced by RETICULATE_PYTHON

──────────────────────────────────────────────────────────────────────────────