Source file: notebooks/low_quality_cells/validation_mouse_pc.Rmd

Last updated: 2018-05-29

Code version: f478d2e

library(cowplot)
library(ggplot2)
library(ggpubr)
library(ggrastr)
library(dplyr)
library(Matrix)
library(parallel)
library(reshape2)
library(Seurat)

library(dropestr)
library(dropEstAnalysis)

theme_set(theme_base)

set.seed(42)
kDataPath <- '../../data/dropest/allon_new/'

kOutputFolder <- '../../output/'
kCsvLink <- 'ftp://ftp.ncbi.nlm.nih.gov/geo/samples/GSM2230nnn/GSM2230762/suppl/GSM2230762%5Fmouse2%5Fumifm%5Fcounts%2Ecsv%2Egz'
kRescuedScoreThreshold <- 0.9
kFilteredScoreThreshold <- 0.1
LibrariesUnion <- function(libs, names.func=names, set.names.func=setNames, union.func=unlist) {
  return(lapply(1:length(libs), function(i) 
    set.names.func(libs[[i]], paste0(names.func(libs[[i]]), '-', i))) %>% union.func())
}

Load data

Pipeline data

d_folders <- c('SRR3879617/est_11_22/', 'SRR3879618/est_11_22/', 'SRR3879619/est_11_29/')
rds_paths <- paste0(kDataPath, d_folders, 'cell.counts.rds')
holders <- mclapply(rds_paths, readRDS, mc.cores=3)
cms <- lapply(holders, `[[`, 'cm')
common_genes <- Reduce(intersect, lapply(cms, rownames))
cms <- lapply(cms, function(x) x[common_genes,])

cm_union <- LibrariesUnion(cms, colnames, `colnames<-`, function(x) Reduce(cbind, x))
scores <- mclapply(holders, ScorePipelineCells, mit.chromosome.name='chrM', 
                   mc.cores=length(holders)) %>% LibrariesUnion()

mit_fracs <- lapply(holders, `[[`, 'reads_per_chr_per_cells') %>% lapply(`[[`, 'Exon') %>%
  lapply(GetChromosomeFraction, 'chrM') %>% LibrariesUnion()

umis_per_cb <- sort(Matrix::colSums(cm_union), decreasing=T)

Data from the paper

published_csv <- url(kCsvLink) %>% gzcon() %>% readLines() %>% paste0(collapse='\n') %>% 
  data.table::fread(data.table=F)

published_csv <- published_csv[, 1:3] %>%
  mutate(LibId = substr(V1, 11, 11) %>% as.integer(),
         Barcode = gsub("-", "", barcode) %>% paste0('-', LibId),
         Cluster = gsub("_", " ", assigned_cluster)) %>%
  dplyr::select(-V1, -barcode, -LibId, -assigned_cluster)

cluster_by_barcodes <- setNames(published_csv$Cluster, published_csv$Barcode)
dim(published_csv)
[1] 1064    2

Pagoda analysis

r_cm <- cm_union[, order(Matrix::colSums(cm_union), decreasing=T)]

cell_mask <- setNames(rep(FALSE, ncol(r_cm)), colnames(r_cm))
cell_mask[names(scores)[scores > kRescuedScoreThreshold]] <- TRUE
cell_mask[intersect(names(cluster_by_barcodes), names(cell_mask))] <- TRUE
r_cm <- r_cm[, cell_mask]

r_cm <- r_cm[Matrix::rowSums(r_cm) > 20, ]

cluster_by_barcodes <- cluster_by_barcodes[names(cluster_by_barcodes) %>% 
                                             intersect(colnames(r_cm))]
r <- GetPagoda(r_cm, n.cores=10)
1167 cells, 14393 genes; normalizing ... using plain model winsorizing ... log scale ... done.
calculating variance fit ... using gam 333 overdispersed genes ... 333 persisting ... done.
running PCA using 1000 OD genes .... done
calculating distance ... pearson ...running tSNE using 10 cores:
PlotPagodaEmbeding(r, colors=mit_fracs, show.legend=T, title='Mitochondrial fraction',
                   alpha=0.9, size=0.5, font.size=4.5) +
  scale_color_continuous(name='Fraction') +
  theme_pdf(legend.pos=c(1, 1))

Number of cells

umi_counts_union_full <- sort(colSums(cm_union), decreasing=T)
umi_counts_union <- umi_counts_union_full[1:5000]
gg1 <- PlotCellsNumberHist(umi_counts_union_full, breaks=80, estimate.cells.number=T) +
  scale_x_continuous(name='#UMI in cell', labels=round(10^(2:4)), breaks=2:4) + 
  theme_pdf()
gg2 <- PlotCellsNumberLine(umi_counts_union_full, breaks=80, estimate.cells.number=T) + 
  theme_pdf() + theme(legend.position="none")
gg3 <- PlotCellsNumberLogLog(umi_counts_union_full, estimate.cells.number=T) + 
  theme_pdf() + theme(legend.position="none")

gg_cell_num <- cowplot::plot_grid(gg1, gg2, gg3, ncol=1, nrow=3, labels="AUTO")

ggsave(paste0(kOutputFolder, 'figures/supp_cell_num_srr3.pdf'), gg_cell_num, 
       width=5, height=7)

gg_cell_num

Rescued cells

filtered_cbs <- intersect(names(cluster_by_barcodes), 
                          names(scores)[scores <= kFilteredScoreThreshold])
rescued_cbs <- setdiff(names(scores)[scores > kRescuedScoreThreshold], 
                       names(cluster_by_barcodes))
intersect_cbs <- intersect(names(r$clusters$PCA$infomap), names(cluster_by_barcodes))
notannotated_cells <- setdiff(colnames(r_cm), names(cluster_by_barcodes))
clusters_annotated_resc <- AnnotateClustersByGraph(r$graphs$PCA, cluster_by_barcodes, 
                                            notannotated_cells,
                                            max.iter=100, mc.cores=10)
rescued_clusters <- clusters_annotated_resc[rescued_cbs]
plot_clusters <- cluster_by_barcodes[names(scores)[scores > kFilteredScoreThreshold]]
plot_rescued_clusters <- rescued_clusters

for (type in c("immune other", "activated stellate", "quiescent stellate")) {
  plot_clusters[plot_clusters == type] <- gsub(" ", "\n", type)
  plot_rescued_clusters[plot_rescued_clusters == type] <- gsub(" ", "\n", type)
}

gg_tsne <- PlotFiltrationResults(r, clusters=plot_clusters, 
                                 rescued.clusters=plot_rescued_clusters,
                                 filtered.cbs=filtered_cbs,
                                 unchanged.alpha=1, rescued.alpha=1, lineheight=0.7,
                                 raster.width=7 / 1.75, raster.height=6 / 1.3) +
  theme_pdf(legend.pos=c(0, 1), show.ticks=F)

gg_tsne

Number of rescued cells per cluster

rescued_table <- TableOfRescuedCells(clusters_annotated_resc[c(intersect_cbs, rescued_cbs)], 
                                     rescued_cbs)
write.csv(rescued_table, paste0(kOutputFolder, "tables/rescued_cbc_srr3.csv"), row.names=F)
rescued_table
Cell type Total num. of cells Num. of rescued Fraction of rescued, %
activated stellate 10 0 0.00
alpha 200 19 9.50
B cell 8 0 0.00
beta 622 74 11.90
delta 137 6 4.38
ductal 41 2 4.88
endothelial 68 1 1.47
gamma 29 2 6.90
immune other 4 0 0.00
macrophage 24 5 20.83
quiescent stellate 18 1 5.56
schwann 3 0 0.00
T cell 3 0 0.00

Seurat analysis

srt <- CreateSeuratObject(raw.data=r_cm, min.cells=10, min.genes=0, display.progress=F)
srt <- NormalizeData(object = srt, normalization.method = "LogNormalize", 
                     scale.factor = 10000, display.progress=F)
srt <- FindVariableGenes(object=srt, mean.function=ExpMean, dispersion.function=LogVMR,
                         x.low.cutoff = 0.0125, x.high.cutoff = 3, y.cutoff = 1, 
                         do.plot=F, display.progress=F)
srt <- ScaleData(object = srt, vars.to.regress = "nUMI", display.progress=F)
srt@ident <- as.factor(clusters_annotated_resc[colnames(srt@raw.data)])
names(srt@ident) <- colnames(srt@raw.data)
compared_clusters <- c('beta', 'delta', 'alpha', 'gamma')
cluster_markers <- mclapply(compared_clusters, function(i) 
  mclapply(setdiff(compared_clusters, i), FindClusterMarkers, i, srt, mc.cores=3), 
  mc.cores=4)
overexpressed_genes <- GetOverexpressedGenes(srt, compared_clusters, cluster_markers, 
                                             genes.from.cluster=50, 
                                             expression.threshold=0.3)
length(overexpressed_genes)
[1] 174

Heatmaps

clusts_after_filt <- cluster_by_barcodes[setdiff(names(cluster_by_barcodes), filtered_cbs)]
real_clusts <- c(clusts_after_filt, rescued_clusters)
selected_clusters <- compared_clusters

tested_clusts <- sort(real_clusts[real_clusts %in% selected_clusters])
separation <- c(setNames(rep('rescued', length(rescued_cbs)), rescued_cbs),
                setNames(rep('real', length(clusts_after_filt)), names(clusts_after_filt)))

umis_per_cb_subset <- log10(Matrix::colSums(r_cm[, names(tested_clusts)]))
tested_clusts <- tested_clusts[order(tested_clusts, -umis_per_cb_subset)]
de_genes <- intersect(overexpressed_genes, colnames(r$counts))
plot_df <- ExpressionMatrixToDataFrame(r$counts[names(tested_clusts), de_genes], 
                                       umis_per_cb_subset, tested_clusts, rescued_cbs)
# plot_df <- plot_df %>% filter(UmisPerCb < 3.5)
plot_dfs <- split(plot_df, plot_df$IsRescued) %>% setNames(c('real', 'rescued'))

ggs <- lapply(plot_dfs, HeatmapAnnotGG) %>%
  lapply(lapply, `+`, theme(plot.margin=margin()))

legend_guides <- list(HeatmapLegendGuide('Expression'),
                      HeatmapLegendGuide('Cell type', guide=guide_legend, nrow=4),
                      HeatmapLegendGuide('log10(#molecules)'))
gg_legends <- mapply(`+`, ggs$real, legend_guides, SIMPLIFY=F) %>%
  lapply(`+`, theme(legend.margin=margin(l=4, r=4, unit='pt'))) %>% lapply(get_legend)

ggs$real$heatmap <- ggs$real$heatmap + rremove('xlab') + ylab('Cells')
ggs$rescued$heatmap <- ggs$rescued$heatmap + labs(x = 'Genes', y = 'Cells')
ggs_annot <- lapply(ggs, function(gg) plot_grid(plotlist=lapply(gg, `+`, rremove('legend')), 
                                                nrow=1, rel_widths=c(1.5, 0.12, 0.12),
                                                align='h'))

Figure

gg_legends_plot <- plot_grid(plotlist=gg_legends[c(1, 3)], nrow=2, align='v') %>%
  plot_grid(gg_legends[[2]], ncol=2, rel_widths=c(2, 1))

gg_left <- plot_grid(ggs_annot$real, ggs_annot$rescued, nrow=2, labels='AUTO')
gg_right <- plot_grid(gg_tsne + theme(plot.margin=margin(l=0.1, unit='in')), gg_legends_plot,
                      nrow=2, rel_heights=c(1, 0.3), align='v', labels=c('C'))

gg_fig <- plot_grid(gg_left, gg_right, rel_widths=c(0.8, 1)) +
  theme(plot.margin=margin(1, 1, 1, 1))
gg_fig

ggsave(paste0(kOutputFolder, 'figures/supp_lq_srr3.pdf'), gg_fig, width=7, height=6)

Session information

value
version R version 3.4.1 (2017-06-30)
os Ubuntu 14.04.5 LTS
system x86_64, linux-gnu
ui X11
language (EN)
collate en_US.UTF-8
tz America/New_York
date 2018-05-29
package loadedversion date source
1 acepack 1.4.1 2016-10-29 CRAN (R 3.4.1)
2 AnnotationDbi 1.32.3 2016-01-28 Bioconductor
3 ape 5.0 2017-10-30 CRAN (R 3.4.1)
4 assertthat 0.2.0 2017-04-11 CRAN (R 3.4.1)
5 backports 1.1.2 2017-12-13 CRAN (R 3.4.1)
7 base64enc 0.1-3 2015-07-28 cran (@0.1-3)
8 bindr 0.1 2016-11-13 CRAN (R 3.4.1)
9 bindrcpp 0.2 2017-06-17 CRAN (R 3.4.1)
10 Biobase 2.30.0 2016-01-28 Bioconductor
11 BiocGenerics 0.16.1 2016-01-28 Bioconductor
12 bit 1.1-12 2014-04-09 CRAN (R 3.4.1)
13 bit64 0.9-7 2017-05-08 CRAN (R 3.4.1)
14 bitops 1.0-6 2013-08-17 CRAN (R 3.4.1)
15 blob 1.1.0 2017-06-17 CRAN (R 3.4.1)
16 brew 1.0-6 2011-04-13 CRAN (R 3.4.1)
17 broom 0.4.3 2017-11-20 CRAN (R 3.4.1)
18 Cairo 1.5-9 2015-09-26 CRAN (R 3.4.1)
19 caret 6.0-78 2017-12-10 CRAN (R 3.4.1)
20 caTools 1.17.1 2014-09-10 CRAN (R 3.4.1)
21 checkmate 1.8.5 2017-10-24 CRAN (R 3.4.1)
22 class 7.3-14 2015-08-30 CRAN (R 3.4.0)
23 clisymbols 1.2.0 2017-05-21 CRAN (R 3.4.1)
24 cluster 2.0.6 2017-03-16 CRAN (R 3.4.0)
25 codetools 0.2-15 2016-10-05 CRAN (R 3.4.1)
26 colorspace 1.3-2 2016-12-14 CRAN (R 3.4.1)
28 cowplot 0.9.2 2017-12-17 CRAN (R 3.4.1)
29 CVST 0.2-1 2013-12-10 CRAN (R 3.4.1)
30 data.table 1.10.4-3 2017-10-27 CRAN (R 3.4.1)
32 DBI 1.0.0 2018-05-02 CRAN (R 3.4.1)
33 ddalpha 1.3.1 2017-09-27 CRAN (R 3.4.1)
34 dendsort 0.3.3 2015-12-14 cran (@0.3.3)
35 DEoptimR 1.0-8 2016-11-19 CRAN (R 3.4.1)
36 diffusionMap 1.1-0 2014-02-20 CRAN (R 3.4.1)
37 digest 0.6.15 2018-01-28 cran (@0.6.15)
38 dimRed 0.1.0 2017-05-04 CRAN (R 3.4.1)
39 diptest 0.75-7 2016-12-05 CRAN (R 3.4.1)
40 doParallel 1.0.11 2017-09-28 CRAN (R 3.4.1)
41 dplyr 0.7.4 2017-09-28 CRAN (R 3.4.1)
42 dropEstAnalysis 0.6.0 2018-05-16 local (VPetukhov/dropEstAnalysis@NA)
43 dropestr 0.7.7 2018-03-17 local (@0.7.7)
44 DRR 0.0.2 2016-09-15 CRAN (R 3.4.1)
45 dtw 1.18-1 2015-09-01 CRAN (R 3.4.1)
46 evaluate 0.10.1 2017-06-24 CRAN (R 3.4.1)
47 flexmix 2.3-14 2017-04-28 CRAN (R 3.4.1)
48 FNN 1.1 2013-07-31 CRAN (R 3.4.1)
49 foreach 1.4.4 2017-12-12 CRAN (R 3.4.1)
50 foreign 0.8-69 2017-06-21 CRAN (R 3.4.0)
51 Formula 1.2-2 2017-07-10 CRAN (R 3.4.1)
52 fpc 2.1-10 2015-08-14 CRAN (R 3.4.1)
53 gdata 2.18.0 2017-06-06 CRAN (R 3.4.1)
54 ggjoy 0.4.0 2017-09-15 CRAN (R 3.4.1)
55 ggplot2 2.2.1 2016-12-30 CRAN (R 3.4.1)
56 ggpubr 0.1.6 2017-11-14 CRAN (R 3.4.1)
57 ggrastr 0.1.5 2017-12-28 Github (VPetukhov/ggrastr@cc56b45)
58 ggrepel 0.7.0 2017-09-29 CRAN (R 3.4.1)
59 ggridges 0.4.1 2017-09-15 CRAN (R 3.4.1)
60 git2r 0.21.0 2018-01-04 cran (@0.21.0)
61 glue 1.2.0 2017-10-29 CRAN (R 3.4.1)
62 GO.db 3.2.2 2017-11-12 Bioconductor
63 gower 0.1.2 2017-02-23 CRAN (R 3.4.1)
64 gplots 3.0.1 2016-03-30 CRAN (R 3.4.1)
68 gridBase 0.4-7 2014-02-24 CRAN (R 3.4.1)
69 gridExtra 2.3 2017-09-09 CRAN (R 3.4.1)
70 gtable 0.2.0 2016-02-26 CRAN (R 3.4.1)
71 gtools 3.5.0 2015-05-29 CRAN (R 3.4.1)
72 highr 0.6 2016-05-09 CRAN (R 3.4.1)
73 Hmisc 4.0-3 2017-05-02 CRAN (R 3.4.1)
74 htmlTable 1.11.0 2017-12-01 CRAN (R 3.4.1)
75 htmltools 0.3.6 2017-04-28 CRAN (R 3.4.1)
76 htmlwidgets 1.0 2018-01-20 cran (@1.0)
77 ica 1.0-1 2015-08-25 CRAN (R 3.4.1)
78 igraph 1.2.1 2018-03-10 cran (@1.2.1)
79 ipred 0.9-6 2017-03-01 CRAN (R 3.4.1)
80 IRanges 2.4.8 2016-09-15 Bioconductor
81 irlba 2.3.2 2018-01-11 cran (@2.3.2)
82 iterators 1.0.9 2017-12-12 CRAN (R 3.4.1)
83 kernlab 0.9-25 2016-10-03 CRAN (R 3.4.1)
84 KernSmooth 2.23-15 2015-06-29 CRAN (R 3.4.0)
85 knitr 1.20 2018-02-20 cran (@1.20)
86 labeling 0.3 2014-08-23 CRAN (R 3.4.1)
87 lars 1.2 2013-04-24 CRAN (R 3.4.1)
88 lattice 0.20-35 2017-03-25 CRAN (R 3.4.1)
89 latticeExtra 0.6-28 2016-02-09 CRAN (R 3.4.1)
90 lava 1.5.1 2017-09-27 CRAN (R 3.4.1)
91 lazyeval 0.2.1 2017-10-29 CRAN (R 3.4.1)
92 lubridate 1.7.1 2017-11-03 CRAN (R 3.4.1)
93 magrittr 1.5 2014-11-22 CRAN (R 3.4.1)
94 MASS 7.3-47 2017-04-21 CRAN (R 3.4.0)
95 Matrix 1.2-12 2017-11-16 CRAN (R 3.4.1)
96 mclust 5.4 2017-11-22 CRAN (R 3.4.1)
97 memoise 1.1.0 2017-04-21 CRAN (R 3.4.1)
99 mgcv 1.8-22 2017-09-19 CRAN (R 3.4.1)
100 mixtools 1.1.0 2017-03-10 CRAN (R 3.4.1)
101 mnormt 1.5-5 2016-10-15 CRAN (R 3.4.1)
102 ModelMetrics 1.1.0 2016-08-26 CRAN (R 3.4.1)
103 modeltools 0.2-21 2013-09-02 CRAN (R 3.4.1)
104 munsell 0.4.3 2016-02-13 CRAN (R 3.4.1)
105 mvtnorm 1.0-7 2018-01-26 cran (@1.0-7)
106 nlme 3.1-131 2017-02-06 CRAN (R 3.4.0)
107 NMF 0.20.6 2015-05-26 CRAN (R 3.4.1)
108 nnet 7.3-12 2016-02-02 CRAN (R 3.4.0)
109 numDeriv 2016.8-1 2016-08-27 CRAN (R 3.4.1)
110 pagoda2 0.0.0.9002 2018-04-08 local (hms-dbmi/pagoda2@NA)
112 pbapply 1.3-3 2017-07-04 CRAN (R 3.4.1)
113 pcaMethods 1.60.0 2017-11-12 Bioconductor
114 pkgconfig 2.0.1 2017-03-21 CRAN (R 3.4.1)
115 pkgmaker 0.22 2014-05-14 CRAN (R 3.4.1)
116 plyr 1.8.4 2016-06-08 CRAN (R 3.4.1)
117 prabclus 2.2-6 2015-01-14 CRAN (R 3.4.1)
118 prodlim 1.6.1 2017-03-06 CRAN (R 3.4.1)
119 proxy 0.4-20 2017-12-12 CRAN (R 3.4.1)
120 psych 1.7.8 2017-09-09 CRAN (R 3.4.1)
121 purrr 0.2.4 2017-10-18 CRAN (R 3.4.1)
122 R.methodsS3 1.7.1 2016-02-16 CRAN (R 3.4.1)
123 R.oo 1.21.0 2016-11-01 CRAN (R 3.4.1)
124 R.utils 2.6.0 2017-11-05 CRAN (R 3.4.1)
125 R6 2.2.2 2017-06-17 CRAN (R 3.4.1)
126 ranger 0.8.0 2017-06-20 CRAN (R 3.4.1)
127 RColorBrewer 1.1-2 2014-12-07 CRAN (R 3.4.1)
128 Rcpp 0.12.17 2018-05-18 cran (@0.12.17)
129 RcppRoll 0.2.2 2015-04-05 CRAN (R 3.4.1)
130 recipes 0.1.1 2017-11-20 CRAN (R 3.4.1)
131 registry 0.5 2017-12-03 CRAN (R 3.4.1)
132 reshape2 1.4.3 2017-12-11 CRAN (R 3.4.1)
133 rjson 0.2.19 2018-05-18 cran (@0.2.19)
134 rlang 0.1.4 2017-11-05 CRAN (R 3.4.1)
135 rmarkdown 1.9 2018-03-01 CRAN (R 3.4.1)
136 rngtools 1.2.4 2014-03-06 CRAN (R 3.4.1)
137 robustbase 0.92-8 2017-11-01 CRAN (R 3.4.1)
138 ROCR 1.0-7 2015-03-26 CRAN (R 3.4.1)
139 Rook 1.1-1 2014-10-20 CRAN (R 3.4.1)
140 rpart 4.1-11 2017-04-21 CRAN (R 3.4.0)
141 rprojroot 1.3-2 2018-01-03 cran (@1.3-2)
142 RSQLite 2.0 2017-06-19 CRAN (R 3.4.1)
143 rstudioapi 0.7 2017-09-07 CRAN (R 3.4.1)
144 Rtsne 0.14 2017-11-12 Github (jkrijthe/Rtsne@1d0f926)
145 S4Vectors 0.8.11 2016-01-30 Bioconductor
146 scales 0.5.0 2017-08-24 CRAN (R 3.4.1)
147 scatterplot3d 0.3-40 2017-04-22 CRAN (R 3.4.1)
148 SDMTools 1.1-221 2014-08-05 CRAN (R 3.4.1)
149 segmented 0.5-3.0 2017-11-30 CRAN (R 3.4.1)
150 sessioninfo 1.0.0 2017-06-21 CRAN (R 3.4.1)
151 Seurat 2.1.0 2017-10-12 CRAN (R 3.4.1)
152 sfsmisc 1.1-1 2017-06-08 CRAN (R 3.4.1)
153 sn 1.5-1 2017-11-23 CRAN (R 3.4.1)
157 stringi 1.1.7 2018-03-12 cran (@1.1.7)
158 stringr 1.3.0 2018-02-19 cran (@1.3.0)
159 survival 2.41-3 2017-04-04 CRAN (R 3.4.0)
160 tclust 1.3-1 2017-08-24 CRAN (R 3.4.1)
161 tibble 1.3.4 2017-08-22 CRAN (R 3.4.1)
162 tidyr 0.7.2 2017-10-16 CRAN (R 3.4.1)
163 tidyselect 0.2.3 2017-11-06 CRAN (R 3.4.1)
164 timeDate 3042.101 2017-11-16 CRAN (R 3.4.1)
166 triebeard 0.3.0 2016-08-04 cran (@0.3.0)
167 trimcluster 0.1-2 2012-10-29 CRAN (R 3.4.1)
168 tsne 0.1-3 2016-07-15 CRAN (R 3.4.1)
169 urltools 1.7.0 2018-01-20 cran (@1.7.0)
171 VGAM 1.0-4 2017-07-25 CRAN (R 3.4.1)
172 withr 2.1.2 2018-03-15 cran (@2.1.2)
173 xtable 1.8-2 2016-02-05 CRAN (R 3.4.1)
174 yaml 2.1.18 2018-03-08 cran (@2.1.18)

This R Markdown site was created with workflowr