Stickels, R.R., Murray, E., Kumar, P., Li, J., Marshall, J.L., Di Bella, D.J., Arlotta, P., Macosko, E.Z., and Chen, F. (2020). Highly sensitive spatial transcriptomics at near-cellular resolution with Slide-seqV2. Nat. Biotechnol.



Load required packages.

library(data.table)
library(tidyverse)
library(magrittr)
library(patchwork)
library(extrafont)
library(Matrix)
Sys.time()
## [1] "2021-02-06 18:19:50 CST"


Data preparation


Functions

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

Matrix

PROJECT_DIR <- "/Users/jialei/Dropbox/Data/Projects/UTSW/Spatial_sequencing/datasets/Slide-seqV2"
list.files(path = file.path(PROJECT_DIR, "raw/SCP815/other"))
##  [1] "Puck_190921_19_bead_locations.csv.gz"    
##  [2] "Puck_190921_19.digital_expression.txt.gz"
##  [3] "Puck_190921_21_bead_locations.csv.gz"    
##  [4] "Puck_190921_21.digital_expression.txt.gz"
##  [5] "Puck_190926_01_bead_locations.csv.gz"    
##  [6] "Puck_190926_01.digital_expression.txt.gz"
##  [7] "Puck_190926_02_bead_locations.csv.gz"    
##  [8] "Puck_190926_02.digital_expression.txt.gz"
##  [9] "Puck_190926_03_bead_locations.csv.gz"    
## [10] "Puck_190926_03.digital_expression.txt.gz"
## [11] "Puck_190926_06_bead_locations.csv.gz"    
## [12] "Puck_190926_06.digital_expression.txt.gz"
## [13] "Puck_191007_07_bead_locations.csv.gz"    
## [14] "Puck_191007_07.digital_expression.txt.gz"
## [15] "Puck_191204_01_bead_locations.csv.gz"    
## [16] "Puck_191204_01.digital_expression.txt.gz"
## [17] "Puck_200115_08_bead_locations.csv.gz"    
## [18] "Puck_200115_08.digital_expression.txt.gz"

mRNA detection sensitivity

Load matrix and coordinates.

matrix_readcount_use <- load_matrix(
    x = file.path(
        PROJECT_DIR,
        "raw/SCP815/other",
        "Puck_200115_08.digital_expression.txt.gz"
    )
)

barcode_location <- read_csv(
    file = file.path(
        PROJECT_DIR,
        "raw/SCP815/other",
        "Puck_200115_08_bead_locations.csv.gz"
    ),
    col_names = c("barcode", "x_coord", "y_coord"),
    skip = 1
)
## 
## ── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
## cols(
##   barcode = col_character(),
##   x_coord = col_double(),
##   y_coord = col_double()
## )

Create AnnData object.

ad <- reticulate::import(module = "anndata", convert = TRUE)
print(ad$`__version__`)
## [1] "0.7.5"
adata <- ad$AnnData(
    X = t(matrix_readcount_use),
    obs = data.frame(
        cell = colnames(matrix_readcount_use),
        num_umis = colSums(matrix_readcount_use),
        mt_percentage = colSums(
            matrix_readcount_use[
                str_detect(
                    string = rownames(matrix_readcount_use),
                    pattern = "mt-"
                ),
            ]
        ) / colSums(matrix_readcount_use),
        row.names = colnames(matrix_readcount_use)
    ),
    var = data.frame(
        feature = rownames(matrix_readcount_use),
        row.names = rownames(matrix_readcount_use)
    )
)

file_name <- file.path(
    PROJECT_DIR,
    "clustering",
    "matrices",
    "puck_200115_08.h5ad"
)
# file_name
if (!file.exists(file_name)) {
    adata$write(
        file_name
    )
}
barcode_location %<>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, barcode]),
        num_features = colSums(matrix_readcount_use[, barcode] > 0),
        num_umis_mt = colSums(
            matrix_readcount_use[
                str_detect(string = rownames(matrix_readcount_use), pattern = "mt-"),
                barcode
            ]
        ),
        mt_ratio = num_umis_mt / num_umis
    )

barcode_location %>%
    summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_ratio = median(mt_ratio)
    ) %>%
    gt::gt() %>%
    # gt::cols_label(n = "num_cells") %>%
    gt::tab_options(table.font.size = "median")
num_cells median_umis median_features median_mt_ratio
53208 302 235 0.08514392
purrr::map(seq(0, 1, 0.25), function(x) {
    cat(x, "\n")

    barcode_location %>%
        summarise(
            num_umis = quantile(num_umis, x),
            num_features = quantile(num_features, x),
            mt_ratio = quantile(mt_ratio, x)
        ) %>%
        mutate(
            quantile = x
        ) %>%
        select(quantile, everything())
}) %>%
    bind_rows() %>%
    gt::gt() %>%
    # gt::cols_label(n = "num_cells") %>%
    gt::tab_options(table.font.size = "median")
## 0 
## 0.25 
## 0.5 
## 0.75 
## 1
quantile num_umis num_features mt_ratio
0.00 10.00 6 0.00000000
0.25 118.00 98 0.04605263
0.50 302.00 235 0.08514392
0.75 736.25 553 0.15544586
1.00 23772.00 8557 0.68421053

Spatial visualization

GEOM_POINT_SIZE <- 0.5

p_spatial_UMI <- plot_embedding(
    embedding = barcode_location %>%
        dplyr::select(x_coord, y_coord),
    color_values = barcode_location$num_umis %>% log10(),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    coord_fixed(
        xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
        ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
    ) +
    theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
    theme_customized_void() +
    ggplot2::guides(
        color = ggplot2::guide_colourbar(
            title = expression(paste("Log"[10], " (UMIs)"))
        )
    ) +
    scale_color_gradientn(
        colors = colorRampPalette(
            colors = rev(
                x = RColorBrewer::brewer.pal(n = 11, name = "Spectral")
            )
        )(n = 100)
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
p_spatial_features <- plot_embedding(
    embedding = barcode_location %>%
        dplyr::select(x_coord, y_coord),
    color_values = barcode_location$num_features %>% log10(),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    coord_fixed(
        xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
        ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
    ) +
    theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
    theme_customized_void() +
    ggplot2::guides(
        color = ggplot2::guide_colourbar(
            title = expression(paste("Log"[10], " (Genes)"))
        )
    ) +
    scale_color_gradientn(
        colors = colorRampPalette(
            colors = rev(
                x = RColorBrewer::brewer.pal(n = 11, name = "Spectral")
            )
        )(n = 100)
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.


Fig. 1a

GEOM_POINT_SIZE <- 0.5

purrr::map2(
    c("num_umis", "num_features"),
    c(
        expression(paste("Log"[10], " (UMIs)")),
        expression(paste("Log"[10], " (Genes)"))
    ), function(x, y) {
        plot_embedding(
            embedding = barcode_location %>%
                dplyr::select(x_coord, y_coord),
            color_values = barcode_location[[x]] %>% log10(),
            show_color_legend = TRUE,
            geom_point_size = GEOM_POINT_SIZE,
            sort_values = TRUE,
            rasterise = TRUE,
            dpi = 600
        ) +
            coord_fixed(
                xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
                ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
            ) +
            theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
            theme_customized_void() +
            ggplot2::guides(
                color = ggplot2::guide_colourbar(
                    title = y
                )
            ) +
            scale_color_gradientn(
                colors = colorRampPalette(
                    colors = rev(
                        x = RColorBrewer::brewer.pal(n = 11, name = "Spectral")
                    )
                )(n = 100)
            )
    }
) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(
        ncol = 2
    ) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

plot_embedding(
    embedding = barcode_location %>%
        dplyr::select(x_coord, y_coord),
    color_values = barcode_location$mt_ratio,
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    coord_fixed(
        xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
        ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
    ) +
    theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
    theme_customized_void() +
    ggplot2::guides(
        color = ggplot2::guide_colourbar(
            title = "MT %"
        )
    ) +
    scale_color_gradientn(
        colors = colorRampPalette(
            colors = rev(
                x = RColorBrewer::brewer.pal(n = 11, name = "Spectral")
            )
        )(n = 100)
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

Visualize cells with different numbers of genes detected.

GEOM_POINT_SIZE <- 0.3

purrr::map(c(200, 500, 1000, 2000), function(x) {
    plot_embedding(
        embedding = barcode_location %>%
            dplyr::select(x_coord, y_coord),
        color_values = as.numeric(barcode_location$num_features >= x) %>%
            as.factor(),
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = TRUE,
        dpi = 600
    ) +
        coord_fixed(
            xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
            ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
        ) +
        theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
        theme_customized_void() +
        scale_color_manual(
            values = c("grey70", "salmon"),
            labels = paste(c("<", ">="), x)
        )
}) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(
        ncol = 2
    ) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )


Fig. 1c

purrr::map(c("Gapdh", "Atp2b1", "Ociad2", "Slc17a7"), function(x) {
    plot_embedding(
        embedding = barcode_location %>%
            dplyr::select(x_coord, y_coord),
        color_values = log10(matrix_readcount_use[x, barcode_location$barcode] + 1),
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = TRUE,
        dpi = 600
    ) +
        coord_fixed(
            xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
            ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
        ) +
        theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
        theme_customized_void() +
        ggplot2::guides(
            color = ggplot2::guide_colourbar(
                title = x
            )
        ) +
        scale_color_gradientn(
            colors = colorRampPalette(
                colors = rev(
                    x = RColorBrewer::brewer.pal(n = 11, name = "Spectral")
                )
            )(n = 100)
        )
}) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(
        ncol = 2
    ) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.
## Scale for 'colour' is already present. Adding another scale for 'colour',
## which will replace the existing scale.

Clustering

embedding <- read_csv(
    file = file.path(
        PROJECT_DIR,
        "clustering/puck_200115_08/exploring",
        "embedding_ncomponents32_ccc1_seed20200416.csv.gz"
    )
)
## 
## ── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
## cols(
##   cell = col_character(),
##   batch = col_logical(),
##   louvain = col_double(),
##   leiden = col_double(),
##   x_tsne = col_double(),
##   y_tsne = col_double(),
##   x_umap = col_double(),
##   y_umap = col_double(),
##   x_fitsne = col_double(),
##   y_fitsne = col_double(),
##   x_phate = col_double(),
##   y_phate = col_double(),
##   `x_umap_min_dist=0.1` = col_double(),
##   `y_umap_min_dist=0.1` = col_double(),
##   x_multicoretsne = col_double(),
##   y_multicoretsne = col_double()
## )
embedding %>% dim()
## [1] 27680    16
embedding %<>%
    mutate(
        num_umis = colSums(matrix_readcount_use[, cell]),
        num_features = colSums(matrix_readcount_use[, cell] > 0),
        mt_ratio = colSums(
            matrix_readcount_use[
                str_detect(string = rownames(matrix_readcount_use), pattern = "mt-"),
                cell
            ]
        ) / num_umis
    )

embedding %>% head()
embedding %>%
    dplyr::group_by(leiden) %>%
    dplyr::summarise(
        num_cells = n(),
        median_umis = median(num_umis),
        median_features = median(num_features),
        median_mt_ratio = median(mt_ratio)
    ) %>%
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")
leiden num_cells median_umis median_features median_mt_ratio
0 3791 979.0 737.0 0.04683728
1 3268 587.0 426.0 0.05598757
2 3205 451.0 351.0 0.09631148
3 2822 382.0 302.0 0.10734285
4 2074 1183.0 866.5 0.04478874
5 1729 968.0 724.0 0.03016241
6 1432 1070.0 781.0 0.03886781
7 1424 1236.0 924.0 0.02750982
8 1259 826.0 638.0 0.06024096
9 1247 796.0 612.0 0.05173913
10 1141 560.0 409.0 0.08976378
11 963 820.0 627.0 0.06049822
12 897 588.0 443.0 0.08113590
13 746 1159.5 892.0 0.03335862
14 551 1324.0 995.0 0.03610060
15 542 1282.0 785.5 0.05035454
16 362 479.5 359.5 0.09965678
17 227 567.0 445.0 0.08333333
EMBEDDING_TITLE_PREFIX <- "UMAP"
x_column <- "x_umap_min_dist=0.1"
y_column <- "y_umap_min_dist=0.1"

GEOM_POINT_SIZE <- 0.2

p_embedding_leiden <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$leiden %>% as.factor(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; Leiden"),
    label_position = NULL,
    show_color_value_labels = TRUE,
    show_color_legend = FALSE,
    geom_point_size = GEOM_POINT_SIZE,
    geom_point_alpha = 1,
    sort_values = FALSE,
    shuffle_values = FALSE,
    label_size = 6,
    label_hjust = 0,
    label_vjust = 0,
    rasterise = TRUE,
    dpi = 600,
    legend_size = 3,
    legend_ncol = 2
) +
    theme_customized()

p_embedding_UMI <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$num_umis %>% log10(),
    label = paste0(EMBEDDING_TITLE_PREFIX, "; UMIs"),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5)

p_embedding_MT <- plot_embedding(
    embedding = embedding[, c(x_column, y_column)],
    color_values = embedding$mt_ratio,
    label = paste0(EMBEDDING_TITLE_PREFIX, "; MT %"),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5)

list(
    p_embedding_leiden,
    p_embedding_UMI,
    p_embedding_MT
) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(nrow = 1) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

barcode_location %<>%
    left_join(
        embedding %>% select(cell, leiden),
        by = c("barcode" = "cell")
    )
GEOM_POINT_SIZE <- 0.3

p_spatial_na <- plot_embedding(
    embedding = barcode_location %>%
        dplyr::select(x_coord, y_coord),
    color_values = as.numeric(is.na(barcode_location$leiden)) %>% as.factor(),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = TRUE,
    rasterise = TRUE,
    dpi = 600
) +
    coord_fixed(
        xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
        ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
    ) +
    guides(colour = guide_legend(override.aes = list(size = 2), nrow = 2, title = NULL)) +
    theme_customized(x = 0.02, legend_key_size = 1, legend_text_size = 5) +
    theme_customized_void() %+replace%
    theme(
        legend.justification = 0.5,
        legend.position = "bottom"
    ) +
    scale_color_manual(
        values = c("grey70", "salmon"),
        labels = c("incl.", "not incl.")
    )
p_spatial_cluster <- plot_embedding(
    embedding = barcode_location %>%
        dplyr::select(x_coord, y_coord),
    color_values = barcode_location$leiden %>% as.factor(),
    show_color_legend = TRUE,
    geom_point_size = GEOM_POINT_SIZE,
    sort_values = FALSE,
    rasterise = TRUE,
    dpi = 600
) +
    coord_fixed(
        xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
        ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
    ) +
    guides(colour = guide_legend(override.aes = list(size = 2), nrow = 2, title = NULL)) +
    theme_customized(legend_key_size = 1, legend_text_size = 5) %+replace%
    theme_customized_void() %+replace%
    theme(
        legend.justification = 0.5,
        legend.position = "bottom"
    )


Clustering; cells with lower UMI counts and higher MT percentages are discarded.

list(
    p_spatial_na,
    p_spatial_cluster
) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 2) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )

GEOM_POINT_SIZE <- 0.3

purrr::map(sort(unique(embedding$leiden)), function(x) {
    values <- barcode_location$leiden == x
    # values <- values[! is.na(values)]
    values[is.na(values)] <- FALSE

    plot_embedding(
        embedding = barcode_location %>%
            # dplyr::filter(! is.na(leiden)) %>%
            dplyr::select(x_coord, y_coord),
        color_values = as.numeric(values) %>% as.factor(),
        show_color_legend = TRUE,
        geom_point_size = GEOM_POINT_SIZE,
        sort_values = TRUE,
        rasterise = TRUE,
        dpi = 600
    ) +
        coord_fixed(
            xlim = quantile(barcode_location$x_coord, probs = c(0.01, 0.99)),
            ylim = quantile(barcode_location$y_coord, probs = c(0.01, 0.99))
        ) +
        theme_customized(x = 0.02, legend_key_size = 2, legend_text_size = 5) +
        theme_customized_void() +
        scale_color_manual(
            values = c("grey70", "salmon"),
            labels = c("Other", x)
        )
}) %>%
    purrr::reduce(`+`) +
    patchwork::plot_layout(ncol = 3) +
    patchwork::plot_annotation(
        theme = theme(plot.margin = margin())
    )



R session info

devtools::session_info()$platform
##  setting  value                       
##  version  R version 4.0.3 (2020-10-10)
##  os       macOS  11.2                 
##  system   x86_64, darwin20.2.0        
##  ui       unknown                     
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Chicago             
##  date     2021-02-06
devtools::session_info()$pack %>%
    as_tibble() %>%
    dplyr::select(
        package,
        loadedversion,
        date,
        `source`
    ) %>%
    # print(n = Inf)
    gt::gt() %>%
    gt::tab_options(table.font.size = "median")
package loadedversion date source
assertthat 0.2.1 2019-03-21 CRAN (R 4.0.0)
backports 1.2.1 2020-12-09 CRAN (R 4.0.3)
beeswarm 0.2.3 2016-04-25 CRAN (R 4.0.0)
broom 0.7.4.9000 2021-02-05 Github (tidymodels/broom@81e10a8)
bslib 0.2.4.9001 2021-02-05 Github (rstudio/bslib@3d98072)
cachem 1.0.3.9000 2021-02-06 Github (r-lib/cachem@805f469)
callr 3.5.1.9000 2021-01-06 Github (r-lib/callr@743069f)
cellranger 1.1.0 2016-07-27 CRAN (R 4.0.0)
checkmate 2.0.0 2020-02-06 CRAN (R 4.0.0)
cli 2.3.0 2021-01-31 CRAN (R 4.0.3)
colorspace 2.0-0 2020-11-10 R-Forge (R 4.0.3)
crayon 1.4.0 2021-01-30 CRAN (R 4.0.3)
data.table 1.13.7 2021-02-04 local
DBI 1.1.1 2021-01-15 CRAN (R 4.0.3)
dbplyr 2.1.0 2021-02-03 CRAN (R 4.0.3)
desc 1.2.0 2018-05-01 CRAN (R 4.0.0)
devtools 2.3.1.9000 2021-02-05 Github (r-lib/devtools@5a047ba)
digest 0.6.27 2020-10-24 CRAN (R 4.0.3)
dplyr 1.0.4.9000 2021-02-04 Github (tidyverse/dplyr@2455c77)
ellipsis 0.3.1 2020-05-15 CRAN (R 4.0.3)
evaluate 0.14 2019-05-28 CRAN (R 4.0.0)
extrafont 0.17 2014-12-08 CRAN (R 4.0.3)
extrafontdb 1.0 2012-06-11 CRAN (R 4.0.0)
fansi 0.4.2 2021-01-15 CRAN (R 4.0.3)
farver 2.0.3 2020-01-16 CRAN (R 4.0.0)
fastmap 1.1.0 2021-01-25 CRAN (R 4.0.3)
forcats 0.5.1.9000 2021-01-28 Github (tidyverse/forcats@b5fce89)
fs 1.5.0 2020-07-31 CRAN (R 4.0.3)
generics 0.1.0 2020-10-31 CRAN (R 4.0.3)
ggbeeswarm 0.6.0 2017-08-07 CRAN (R 4.0.3)
ggplot2 3.3.3.9000 2021-02-04 Github (tidyverse/ggplot2@dbd7d79)
ggrastr 0.2.1 2021-01-27 Github (VPetukhov/ggrastr@f1ce011)
glue 1.4.1.9000 2021-02-04 Github (tidyverse/glue@f0a7b2a)
gt 0.2.2 2020-11-25 Github (rstudio/gt@bae32f4)
gtable 0.3.0 2019-03-25 CRAN (R 4.0.0)
haven 2.3.1 2020-06-01 CRAN (R 4.0.0)
highr 0.8 2019-03-20 CRAN (R 4.0.0)
hms 1.0.0 2021-01-13 CRAN (R 4.0.3)
htmltools 0.5.1.9000 2021-02-05 Github (rstudio/htmltools@8d5a998)
httr 1.4.2 2020-07-20 CRAN (R 4.0.2)
jquerylib 0.1.3 2020-12-17 Github (rstudio/jquerylib@8f8e639)
jsonlite 1.7.2 2020-12-09 CRAN (R 4.0.3)
knitr 1.31.5 2021-02-05 Github (yihui/knitr@b2ce792)
labeling 0.4.2 2020-10-20 CRAN (R 4.0.3)
lattice 0.20-41 2020-04-02 CRAN (R 4.0.3)
lifecycle 0.2.0 2020-03-06 CRAN (R 4.0.0)
lubridate 1.7.9.2 2021-01-04 Github (tidyverse/lubridate@aab2e30)
magrittr 2.0.1.9000 2020-12-14 Github (tidyverse/magrittr@bb1c86a)
Matrix 1.3-2 2021-01-06 CRAN (R 4.0.3)
memoise 2.0.0 2021-01-26 CRAN (R 4.0.3)
modelr 0.1.8.9000 2021-01-23 Github (tidyverse/modelr@16168e0)
munsell 0.5.0 2018-06-12 CRAN (R 4.0.0)
patchwork 1.1.1 2020-12-17 CRAN (R 4.0.3)
pillar 1.4.99.9006 2021-02-04 Github (r-lib/pillar@bb460c1)
pkgbuild 1.2.0 2020-12-15 CRAN (R 4.0.3)
pkgconfig 2.0.3 2019-09-22 CRAN (R 4.0.0)
pkgload 1.1.0 2020-05-29 CRAN (R 4.0.0)
png 0.1-7 2013-12-03 CRAN (R 4.0.0)
prettyunits 1.1.1.9000 2020-11-23 Github (r-lib/prettyunits@b1cdad8)
processx 3.4.5 2020-11-30 CRAN (R 4.0.3)
ps 1.5.0 2020-12-05 CRAN (R 4.0.3)
purrr 0.3.4.9000 2021-02-04 Github (tidyverse/purrr@af06d45)
R.methodsS3 1.8.1 2020-08-26 CRAN (R 4.0.2)
R.oo 1.24.0 2020-08-26 CRAN (R 4.0.2)
R.utils 2.10.1 2020-08-26 CRAN (R 4.0.2)
R6 2.5.0 2021-02-04 Github (r-lib/R6@6cf7d4e)
ragg 0.4.1 2021-01-11 CRAN (R 4.0.3)
RColorBrewer 1.1-2 2014-12-07 CRAN (R 4.0.0)
Rcpp 1.0.6 2021-01-15 CRAN (R 4.0.3)
readr 1.4.0.9000 2021-01-23 Github (tidyverse/readr@483ca6c)
readxl 1.3.1.9000 2021-01-23 Github (tidyverse/readxl@9f85fa5)
remotes 2.2.0.9000 2021-02-05 Github (r-lib/remotes@62ff718)
reprex 1.0.0 2021-01-27 CRAN (R 4.0.3)
reticulate 1.18 2020-10-25 CRAN (R 4.0.3)
rlang 0.4.10.9000 2021-02-04 Github (r-lib/rlang@14b7cb4)
rmarkdown 2.6.6 2021-02-05 Github (rstudio/rmarkdown@44d7b10)
rprojroot 2.0.2 2020-11-15 CRAN (R 4.0.3)
rstudioapi 0.13.0-9000 2021-02-06 Github (rstudio/rstudioapi@9d21f50)
Rttf2pt1 1.3.8 2020-01-10 CRAN (R 4.0.0)
rvest 0.3.6 2020-07-25 CRAN (R 4.0.2)
sass 0.3.1 2021-01-24 CRAN (R 4.0.3)
scales 1.1.1 2020-05-11 CRAN (R 4.0.3)
sessioninfo 1.1.1 2018-11-05 CRAN (R 4.0.3)
stringi 1.5.3 2020-09-09 CRAN (R 4.0.3)
stringr 1.4.0.9000 2021-01-23 Github (tidyverse/stringr@1f03eb0)
styler 1.3.2.9000 2021-02-02 Github (r-lib/styler@3560b39)
systemfonts 1.0.0.9000 2021-02-02 Github (r-lib/systemfonts@d85abe2)
testthat 3.0.1 2021-02-04 Github (r-lib/testthat@2072757)
textshaping 0.2.1.9000 2021-02-06 Github (r-lib/textshaping@862fbf0)
tibble 3.0.6.9000 2021-02-04 Github (tidyverse/tibble@eb99cb6)
tidyr 1.1.2.9000 2021-01-23 Github (tidyverse/tidyr@c338aa9)
tidyselect 1.1.0 2020-05-11 CRAN (R 4.0.3)
tidyverse 1.3.0.9000 2021-02-04 Github (hadley/tidyverse@8a0bb99)
usethis 2.0.0.9000 2021-02-06 Github (r-lib/usethis@1ae30a1)
utf8 1.1.4 2018-05-24 CRAN (R 4.0.0)
vctrs 0.3.6 2020-12-17 CRAN (R 4.0.3)
vipor 0.4.5 2017-03-22 CRAN (R 4.0.0)
viridisLite 0.3.0 2018-02-01 CRAN (R 4.0.0)
withr 2.4.1 2021-01-26 CRAN (R 4.0.3)
xfun 0.20 2021-01-06 CRAN (R 4.0.3)
xml2 1.3.2 2020-04-23 CRAN (R 4.0.0)
yaml 2.2.1 2020-02-01 CRAN (R 4.0.0)