This script compares measured GOTO genotypes to those predicted from DNAm data to check for sample mixups.
Load packages
library(tidyverse)
library(snpStats)
Read in the GOTO genotyping files
lls_plink <- read.plink(
bed = '../GOTO_Data/Processing/Genotypes/GOTO.bed',
bim = '../GOTO_Data/Processing/Genotypes/GOTO.bim',
fam = '../GOTO_Data/Processing/Genotypes/GOTO.fam')
Read in the results from omicsPrint (genotyping from DNA methylation values in each of the 3 tissues):
1230 SNPs from 200 fasted blood samples
load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-blood.Rdata')
dnam_blood <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_blood)
## [1] 1230 200
1010 SNPs from 164 muscle samples
load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-muscle.Rdata')
dnam_muscle <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_muscle)
## [1] 1010 164
1059 SNPs from 184 muscle samples
load('../GOTO_Data/Processing/omicsPrint/GOTO_omicsPrint-fat.Rdata')
dnam_fat <- as.data.frame(genotype)
rm(list = c('mismatches', 'out', 'relations', 'genotype'))
dim(dnam_fat)
## [1] 1059 184
Read in key file sent from M.B.
key_id_gwas <- read_csv('../GOTO_Data/Processing/Genotypes/GOTO_Labnrs-EDTA_20210222.csv')
## Rows: 327 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): visit_id, type
## dbl (2): IOP2_ID, labnr
## lgl (2): intervention, fasted
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
key_id_gwas <- key_id_gwas %>% dplyr::select(IOP2_ID, labnr) %>% mutate(labnr = as.character(key_id_gwas$labnr))
Read in the targets file of the methylation data to link sample IDs to other IDs
load('../GOTO_Data/Processing/GOTO_targets-unfiltered.Rdata')
key_id_dnam <- targets
rm('targets')
Save a sample ID key for each set of samples
200 blood samples
key_blood <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
IOP2_ID,
HMU_ID,
DNA_labnr) %>%
filter(sample_ID %in% colnames(dnam_blood)) %>%
mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))
key_blood <- left_join(key_blood, key_id_gwas, by = 'IOP2_ID')
164 muscle samples
key_muscle <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
IOP2_ID,
HMU_ID,
DNA_labnr) %>%
filter(sample_ID %in% colnames(dnam_muscle)) %>%
mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))
key_muscle <- left_join(key_muscle, key_id_gwas, by = 'IOP2_ID')
184 fat samples
key_fat <- key_id_dnam %>% dplyr::select(sample_ID = Basename,
IOP2_ID,
HMU_ID,
DNA_labnr) %>%
filter(sample_ID %in% colnames(dnam_fat)) %>%
mutate(IOP2_ID = as.numeric(as.character(IOP2_ID)))
key_fat <- left_join(key_fat, key_id_gwas, by = 'IOP2_ID')
Save
save(key_blood, key_muscle, key_fat, file = '../GOTO_Data/Processing/Genotypes/GOTO_keys-48.Rdata')
rm(list = c('key_id_gwas', 'key_id_dnam'))
Load in mapping file from Zhou - 667132 CpGs
cpg_snp <- read_tsv('../../../LLS/Shared_Data/Manifests/EPIC.hg38.commonsnp.tsv')
## Rows: 667132 Columns: 111
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (7): probeChrm, probeID, probeStrand, snpChrm, snpID, snpRef, snpAlt
## dbl (104): probeBeg, probeEnd, probeLast, snpBeg, snpEnd, GAN, GAC, GAF, AFR...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cpg_snp <- cpg_snp %>% dplyr::select(cpg=probeID, snpID)
Subset only CpGs that map to a single SNP
cpg_snp <- cpg_snp %>% group_by(cpg) %>%
mutate(n = n()) %>% ungroup() %>%
filter(n == 1) %>% dplyr::select(-n)
Merge with the beta2genotype
data
600 / 1230 CpGs in blood data map to only 1 SNP
dnam_blood <- dnam_blood %>% rownames_to_column(var = 'cpg')
dnam_blood <- inner_join(cpg_snp, dnam_blood, by = 'cpg')
500 / 1010 CpGs in muscle data map to only 1 SNP
dnam_muscle <- dnam_muscle %>% rownames_to_column(var = 'cpg')
dnam_muscle <- inner_join(cpg_snp, dnam_muscle, by = 'cpg')
507 / 1059 CpGs in fat data map to only 1 SNP
dnam_fat <- dnam_fat %>% rownames_to_column(var = 'cpg')
dnam_fat <- inner_join(cpg_snp, dnam_fat, by = 'cpg')
48 individuals were not part of LLS but participated in GOTO. These individuals are the ones kept here in the beta2genotype
data.
The rownames of the genotype data must be converted to labnr
rownames(lls_plink$genotypes) <- lls_plink$fam$member
First we subset the keys:
46 / 200 blood samples have genotypes in GOTO data
key_blood <- key_blood %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_blood)
## [1] 46 5
30 / 164 muscle samples have genotypes in GOTO data
key_muscle <- key_muscle %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_muscle)
## [1] 30 5
44 / 184 fat samples have genotypes in GOTO data
key_fat <- key_fat %>% filter(labnr %in% (rownames(lls_plink$genotypes)))
dim(key_fat)
## [1] 44 5
Now we can subset the beta2genotype
data using these keys
Final blood data of 595 CpGs from 48 samples
dnam_blood <- dnam_blood %>% dplyr::select(cpg, snpID, key_blood$sample_ID)
dim(dnam_blood)
## [1] 595 48
Final muscle data of 488 CpGs from 32 samples
dnam_muscle <- dnam_muscle %>% dplyr::select(cpg, snpID, key_muscle$sample_ID)
dim(dnam_muscle)
## [1] 488 32
Final fat data of 508 CpGs from 46 samples
dnam_fat <- dnam_fat %>% dplyr::select(cpg, snpID, key_fat$sample_ID)
dim(dnam_fat)
## [1] 508 46
Now we can use the finalized beta2genotype
data to subset the genotype data, which contains data on 719665 SNPs from 48 individuals.
lls_plink <- as.data.frame(t(lls_plink$genotypes))
dim(lls_plink)
## [1] 719665 48
130 SNPs for blood found in the genotype data from 24 people
genotype_blood <- lls_plink %>% dplyr::select(key_blood$labnr) %>%
rownames_to_column(var = 'snpID') %>%
filter(snpID %in% dnam_blood$snpID) %>% arrange(snpID)
dim(genotype_blood)
## [1] 130 24
100 SNPs for muscle found in the genotype data from 16 people
genotype_muscle <- lls_plink %>% dplyr::select(key_muscle$labnr) %>%
rownames_to_column(var = 'snpID') %>%
filter(snpID %in% dnam_muscle$snpID) %>% arrange(snpID)
dim(genotype_muscle)
## [1] 100 16
108 SNPs for fat found in the genotype data from 23 people
genotype_fat <- lls_plink %>% dplyr::select(key_fat$labnr) %>%
rownames_to_column(var = 'snpID') %>%
filter(snpID %in% dnam_fat$snpID) %>% arrange(snpID)
dim(genotype_fat)
## [1] 108 23
beta2genotype
for SNPsFinally we keep only the SNPs that overlap with genotype data
130 single SNP CpGs from 48 blood samples
dnam_blood <- dnam_blood %>% filter(snpID %in% genotype_blood$snpID) %>% arrange(snpID)
dim(dnam_blood)
## [1] 130 48
100 single SNP CpGs from 32 muscle samples
dnam_muscle <- dnam_muscle %>% filter(snpID %in% genotype_muscle$snpID) %>% arrange(snpID)
dim(dnam_muscle)
## [1] 100 32
108 single SNP CpGs from 46 fat samples
dnam_fat <- dnam_fat %>% filter(snpID %in% genotype_fat$snpID) %>% arrange(snpID)
dim(dnam_fat)
## [1] 108 46
The genotype data needs to be converted to numeric
genotype_blood[, c(2:ncol(genotype_blood))] <- sapply(genotype_blood[, c(2:ncol(genotype_blood))], as.numeric)
genotype_muscle[, c(2:ncol(genotype_muscle))] <- sapply(genotype_muscle[, c(2:ncol(genotype_muscle))], as.numeric)
genotype_fat[, c(2:ncol(genotype_fat))] <- sapply(genotype_fat[, c(2:ncol(genotype_fat))], as.numeric)
Create a data frame of assumed and actual matches for each sample
dnam <- dnam_blood
gwas <- genotype_blood
key <- key_blood
out_blood <- data.frame()
for(j in 3:ncol(dnam)){
ind <- dnam[,j]
for(i in 2:ncol(gwas)){
out_blood <- rbind(out_blood,
data.frame(sample_ID = (colnames(dnam)[j]),
actual_match = colnames(gwas)[i],
assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}
out <- out_blood %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()
We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for blood.
out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
geom_point(fill = ifelse(out$actual_match == out$assumed_match,
'yellow', 'grey60'),
color = ifelse(out$n_snps == out$max,
'red', 'grey60'),
shape = 21, size = 2) +
theme_bw() +
ylab('Number of matching SNPs \n') + xlab('Sample ID') +
ggtitle('Comparison of genotypes for all sample-person pairs') +
theme(axis.text.x = element_text(angle = 90),
panel.background = element_rect(fill = 'white'),
axis.text.x.bottom = element_blank(),
panel.grid = element_blank(),
axis.title = element_text(size = 16),
title = element_text(size = 14),
axis.text.y = element_text(size = 14)) +
scale_x_discrete(expand = c(-1.01,-1.01))
The smallest overlap is 111 SNPs and as shown above, no sample does not have the highest match with the assumed genotype
out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 46 × 5
## sample_ID actual_match assumed_match n_snps max
## <chr> <chr> <chr> <int> <int>
## 1 203548980012_R03C01 2185 2185 111 111
## 2 203548980012_R04C01 2185 2185 111 111
## 3 203548970015_R05C01 2261 2261 112 112
## 4 203548970015_R06C01 2261 2261 112 112
## 5 203548870105_R03C01 2272 2272 112 112
## 6 203548870105_R04C01 2272 2272 112 112
## 7 203548970098_R03C01 2266 2266 112 112
## 8 203548970098_R04C01 2266 2266 112 112
## 9 203548870020_R01C01 2191 2191 113 113
## 10 203548870020_R02C01 2191 2191 113 113
## # ℹ 36 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## # n_snps <int>, max <int>
Save
save(out, key_blood, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-blood.Rdata')
Create a data frame of assumed and actual matches for each sample
dnam <- dnam_muscle
gwas <- genotype_muscle
key <- key_muscle
out_muscle <- data.frame()
for(j in 3:ncol(dnam)){
ind <- dnam[,j]
for(i in 2:ncol(gwas)){
out_muscle <- rbind(out_muscle,
data.frame(sample_ID = (colnames(dnam)[j]),
actual_match = colnames(gwas)[i],
assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}
out <- out_muscle %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()
We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for muscle.
out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
geom_point(fill = ifelse(out$actual_match == out$assumed_match,
'yellow', 'grey60'),
color = ifelse(out$n_snps == out$max,
'red', 'grey60'),
shape = 21, size = 2) +
theme_bw() +
ylab('Number of matching SNPs \n') + xlab('Sample ID') +
ggtitle('Comparison of genotypes for all sample-person pairs') +
theme(axis.text.x = element_text(angle = 90),
panel.background = element_rect(fill = 'white'),
axis.text.x.bottom = element_blank(),
panel.grid = element_blank(),
axis.title = element_text(size = 16),
title = element_text(size = 14),
axis.text.y = element_text(size = 14)) +
scale_x_discrete(expand = c(-1.01,-1.01))
The smallest overlap is 85 SNPs and there are no mismatches.
out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 30 × 5
## sample_ID actual_match assumed_match n_snps max
## <chr> <chr> <chr> <int> <int>
## 1 203548970025_R01C01 2272 2272 85 85
## 2 203548970025_R02C01 2272 2272 85 85
## 3 203548970014_R03C01 2214 2214 86 86
## 4 203548970014_R04C01 2214 2214 86 86
## 5 203527980075_R03C01 2185 2185 87 87
## 6 203527980075_R04C01 2185 2185 87 87
## 7 203548970062_R05C01 2188 2188 87 87
## 8 203548970062_R06C01 2188 2188 87 87
## 9 203527980082_R06C01 2168 2168 88 88
## 10 203548970102_R02C01 2251 2251 88 88
## # ℹ 20 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## # n_snps <int>, max <int>
Save
save(out, key_muscle, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-muscle.Rdata')
Create a data frame of assumed and actual matches for each sample
dnam <- dnam_fat
gwas <- genotype_fat
key <- key_fat
out_fat <- data.frame()
for(j in 3:ncol(dnam)){
ind <- dnam[,j]
for(i in 2:ncol(gwas)){
out_fat <- rbind(out_fat,
data.frame(sample_ID = (colnames(dnam)[j]),
actual_match = colnames(gwas)[i],
assumed_match = key[key$sample_ID == colnames(dnam)[j],'labnr'],
n_snps = data.frame(xtabs(~gwas[,i] == ind))[2,2]))
}
}
out <- out_fat %>% group_by(sample_ID) %>% mutate(max = max(n_snps)) %>% ungroup()
We visualize the results. For every sample the assumed match also has the most matching SNPs, suggesting no sample mixups for fat
out %>% ggplot(aes(x = sample_ID, y = n_snps)) +
geom_point(fill = ifelse(out$actual_match == out$assumed_match,
'yellow', 'grey60'),
color = ifelse(out$n_snps == out$max,
'red', 'grey60'),
shape = 21, size = 2) +
theme_bw() +
ylab('Number of matching SNPs \n') + xlab('Sample ID') +
ggtitle('Comparison of genotypes for all sample-person pairs') +
theme(axis.text.x = element_text(angle = 90),
panel.background = element_rect(fill = 'white'),
axis.text.x.bottom = element_blank(),
panel.grid = element_blank(),
axis.title = element_text(size = 16),
title = element_text(size = 14),
axis.text.y = element_text(size = 14)) +
scale_x_discrete(expand = c(-1.01,-1.01))
The smallest overlap is 88 SNPs and there are no mismatches.
out %>% filter(n_snps == max) %>% arrange(max)
## # A tibble: 44 × 5
## sample_ID actual_match assumed_match n_snps max
## <chr> <chr> <chr> <int> <int>
## 1 203548970042_R08C01 2141 2141 88 88
## 2 203527980024_R06C01 2272 2272 92 92
## 3 203548970042_R07C01 2141 2141 92 92
## 4 203548870042_R01C01 2185 2185 92 92
## 5 203548870042_R02C01 2185 2185 92 92
## 6 203548970029_R01C01 2202 2202 92 92
## 7 203548970029_R02C01 2202 2202 92 92
## 8 203548970079_R03C01 2261 2261 92 92
## 9 203548970079_R04C01 2261 2261 92 92
## 10 203527980024_R05C01 2272 2272 93 93
## # ℹ 34 more rows
out %>% filter(n_snps == max) %>% filter(actual_match != assumed_match)
## # A tibble: 0 × 5
## # ℹ 5 variables: sample_ID <chr>, actual_match <chr>, assumed_match <chr>,
## # n_snps <int>, max <int>
Save
save(out, key_fat, file='../GOTO_Data/Processing/Genotypes/GOTO_genotypeCheck-GOTO-fat.Rdata')
sessionInfo()
## R version 4.2.2 (2022-10-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Rocky Linux 8.10 (Green Obsidian)
##
## Matrix products: default
## BLAS/LAPACK: /usr/lib64/libopenblas-r0.3.15.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] parallel stats4 stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] snpStats_1.44.0
## [2] survival_3.5-5
## [3] ggrepel_0.9.1
## [4] ggfortify_0.4.14
## [5] irlba_2.3.5.1
## [6] Matrix_1.5-4.1
## [7] omicsPrint_1.14.0
## [8] MASS_7.3-60
## [9] DNAmArray_2.0.0
## [10] pls_2.8-2
## [11] FDb.InfiniumMethylation.hg19_2.2.0
## [12] org.Hs.eg.db_3.14.0
## [13] TxDb.Hsapiens.UCSC.hg19.knownGene_3.2.2
## [14] GenomicFeatures_1.46.5
## [15] AnnotationDbi_1.56.2
## [16] IlluminaHumanMethylationEPICmanifest_0.3.0
## [17] minfi_1.40.0
## [18] bumphunter_1.36.0
## [19] locfit_1.5-9.8
## [20] iterators_1.0.14
## [21] foreach_1.5.2
## [22] Biostrings_2.62.0
## [23] XVector_0.34.0
## [24] SummarizedExperiment_1.24.0
## [25] Biobase_2.58.0
## [26] MatrixGenerics_1.10.0
## [27] matrixStats_1.0.0
## [28] GenomicRanges_1.46.1
## [29] GenomeInfoDb_1.34.9
## [30] IRanges_2.32.0
## [31] S4Vectors_0.36.2
## [32] BiocGenerics_0.44.0
## [33] BiocParallel_1.32.6
## [34] MethylAid_1.28.0
## [35] forcats_0.5.2
## [36] stringr_1.5.0
## [37] dplyr_1.1.3
## [38] purrr_0.3.4
## [39] readr_2.1.2
## [40] tidyr_1.2.1
## [41] tibble_3.2.1
## [42] ggplot2_3.4.3
## [43] tidyverse_1.3.2
## [44] rmarkdown_2.16
##
## loaded via a namespace (and not attached):
## [1] utf8_1.2.3 tidyselect_1.2.0
## [3] RSQLite_2.2.17 grid_4.2.2
## [5] munsell_0.5.0 codetools_0.2-19
## [7] preprocessCore_1.60.2 withr_2.5.0
## [9] colorspace_2.1-0 filelock_1.0.2
## [11] highr_0.10 knitr_1.43
## [13] rstudioapi_0.14 labeling_0.4.2
## [15] GenomeInfoDbData_1.2.9 farver_2.1.1
## [17] bit64_4.0.5 rhdf5_2.42.1
## [19] vctrs_0.6.3 generics_0.1.3
## [21] xfun_0.39 timechange_0.2.0
## [23] BiocFileCache_2.2.1 R6_2.5.1
## [25] illuminaio_0.40.0 bitops_1.0-7
## [27] rhdf5filters_1.10.1 cachem_1.0.8
## [29] reshape_0.8.9 DelayedArray_0.24.0
## [31] assertthat_0.2.1 vroom_1.5.7
## [33] promises_1.2.0.1 BiocIO_1.8.0
## [35] scales_1.2.1 googlesheets4_1.0.1
## [37] gtable_0.3.3 rlang_1.1.1
## [39] genefilter_1.76.0 splines_4.2.2
## [41] rtracklayer_1.54.0 gargle_1.5.0
## [43] GEOquery_2.62.2 htm2txt_2.2.2
## [45] hexbin_1.28.3 broom_1.0.1
## [47] yaml_2.3.7 reshape2_1.4.4
## [49] RaggedExperiment_1.18.0 modelr_0.1.9
## [51] backports_1.4.1 httpuv_1.6.11
## [53] tools_4.2.2 gridBase_0.4-7
## [55] nor1mix_1.3-0 ellipsis_0.3.2
## [57] jquerylib_0.1.4 RColorBrewer_1.1-3
## [59] siggenes_1.68.0 MultiAssayExperiment_1.20.0
## [61] Rcpp_1.0.10 plyr_1.8.8
## [63] sparseMatrixStats_1.10.0 progress_1.2.2
## [65] zlibbioc_1.44.0 RCurl_1.98-1.12
## [67] prettyunits_1.1.1 openssl_2.0.6
## [69] haven_2.5.1 fs_1.6.2
## [71] magrittr_2.0.3 data.table_1.14.8
## [73] reprex_2.0.2 googledrive_2.0.0
## [75] hms_1.1.2 mime_0.12
## [77] evaluate_0.21 xtable_1.8-4
## [79] XML_3.99-0.14 mclust_6.0.0
## [81] readxl_1.4.1 gridExtra_2.3
## [83] compiler_4.2.2 biomaRt_2.50.3
## [85] crayon_1.5.2 htmltools_0.5.5
## [87] later_1.3.1 tzdb_0.4.0
## [89] lubridate_1.9.2 DBI_1.1.3
## [91] dbplyr_2.2.1 rappdirs_0.3.3
## [93] cli_3.6.1 quadprog_1.5-8
## [95] pkgconfig_2.0.3 GenomicAlignments_1.30.0
## [97] xml2_1.3.4 annotate_1.72.0
## [99] bslib_0.5.0 rngtools_1.5.2
## [101] multtest_2.50.0 beanplot_1.3.1
## [103] rvest_1.0.3 doRNG_1.8.6
## [105] scrime_1.3.5 digest_0.6.31
## [107] base64_2.0.1 cellranger_1.1.0
## [109] DelayedMatrixStats_1.16.0 restfulr_0.0.15
## [111] curl_5.0.1 shiny_1.7.2
## [113] Rsamtools_2.10.0 rjson_0.2.21
## [115] lifecycle_1.0.3 nlme_3.1-162
## [117] jsonlite_1.8.5 Rhdf5lib_1.20.0
## [119] askpass_1.1 limma_3.54.2
## [121] fansi_1.0.4 pillar_1.9.0
## [123] lattice_0.21-8 KEGGREST_1.34.0
## [125] fastmap_1.1.1 httr_1.4.6
## [127] glue_1.6.2 png_0.1-8
## [129] bit_4.0.5 stringi_1.7.12
## [131] sass_0.4.6 HDF5Array_1.22.1
## [133] blob_1.2.4 memoise_2.0.1
Clear
rm(list=ls())