animalcules 1.16.0
Note: if you use animalcules in published research, please cite:
Zhao, Y., Federico, A., Faits, T. et al. (2021) animalcules: interactive microbiome analytics and visualization in R Microbiome, 9(1), 1-16. 10.1186/s40168-021-01013-0
animalcules is an R package for utilizing up-to-date data analytics, visualization methods, and machine learning models to provide users an easy-to-use interactive microbiome analysis framework. It can be used as a standalone software package or users can explore their data with the accompanying interactive R Shiny application. Traditional microbiome analysis such as alpha/beta diversity and differential abundance analysis are enhanced, while new methods like biomarker identification are introduced by animalcules. Powerful interactive and dynamic figures generated by animalcules enable users to understand their data better and discover new insights.
Install the development version of the package from Bioconductor.
if (!requireNamespace("BiocManager", quietly=TRUE))
install.packages("BiocManager")
BiocManager::install("compbiomed/animalcules")
Or install the development version of the package from Github.
if (!requireNamespace("devtools", quietly=TRUE))
install.packages("devtools")
devtools::install_github("compbiomed/animalcules")
Load the packages needed into R session.
library(animalcules)
library(SummarizedExperiment)
This command is to start the animalcules shiny app. For shiny app tutorials, please go to our website, and click the tab “Interactive Shiny Analysis”.
The rest of the vignette is for the command line version of animalcules, which could also be found in our website, and click the tab “Command Line Analysis”.
run_animalcules()
This toy dataset contains 50 simulated samples. Throughout the vignette, we will use the data structure MultiAssayExperiment (MAE) as the input to all functions.
data_dir = system.file("extdata/TB_example_dataset.rds", package = "animalcules")
MAE = readRDS(data_dir)
For users who would like to use their own dataset, please follow the following steps:
data_dir = "PATH_TO_THE_ANIMALCULES_FILE"
MAE = readRDS(data_dir)
One of the first steps in the data analysis process involves summarizing the data and looking for outliers or other obvious data issues that may cause issue with downstream analysis.
One type of summarization plot returns either a box plot or pie chart for continous or categorical data respectively.
p <- filter_summary_pie_box(MAE,
samples_discard = c("SRR1204622"),
filter_type = "By Metadata",
sample_condition = "age_s")
p
One type of summarization plot returns either a density plot or bar plot for continous or categorical data respectively.
p <- filter_summary_bar_density(MAE,
samples_discard = c("SRR1204622"),
filter_type = "By Metadata",
sample_condition = "sex_s")
p
It is often necessary to bin continuous data into categories when performing analyses that require categorical input. To help ease this process, users can automatically categorize categorical data and provide custom bin breaks and labels in doing so.
microbe <- MAE[['MicrobeGenetics']]
samples <- as.data.frame(colData(microbe))
result <- filter_categorize(samples,
sample_condition="age_s",
new_label="AGE_GROUP",
bin_breaks=c(0,30,40,100),
bin_labels=c('a','b',"c"))
head(result$sam_table)
# isolate_s Disease age_s sex_s tissue_s AGE_GROUP
# SRR1204622 Patient 1 TB 45 F Sputum c
# SRR1204623 Patient 1 TB 45 F Nasal c
# SRR1204624 Patient 1 TB 45 F Oropharynx c
# SRR1204625 Patient 2 TB 29 M Sputum a
# SRR1204626 Patient 2 TB 29 M Nasal a
# SRR1204627 Patient 2 TB 29 M Oropharynx a
result$plot.unbinned
result$plot.binned
A typical analysis involves visualization of microbe abundances across samples or groups of samples. Animalcules implements three common types of visualization plots including stacked bar plots, heat map, and box plots generated with Plotly.
The stacked bar plots are used to visualize the relative abundance of microbes at a given taxonomical level in each sample represented as a single bar.
p <- relabu_barplot(MAE,
tax_level="genus",
sort_by="conditions",
sample_conditions=c('Disease'),
show_legend=TRUE)
p
The heatmap represents a sample by organisms matrix that can be visualized at different taxonomic levels.
p <- relabu_heatmap(MAE,
tax_level="genus",
sort_by="conditions",
sample_conditions=c("sex_s", "age_s"))
p
The boxplot visualization allows users to compare the abundance of one or more organisms between categorical attributes.
p <- relabu_boxplot(MAE,
tax_level="genus",
organisms=c("Streptococcus", "Staphylococcus"),
condition="sex_s",
datatype="logcpm")
p
# Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
# Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
# Warning: 'layout' objects don't have these attributes: 'boxmode'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
Alpha diversity, which describes the richness and evenness of sample microbial community, is a vital indicator in the microbiome analysis. animalcules provides the interactive boxplot comparison of alpha diversity between selected groups of samples. Both taxonomy levels and alpha diversity metrics (Shannon, Gini Simpson, Inverse Simpson) can be changed. Users can also conduct alpha diversity statistical tests including Wilcoxon rank sum test, T test and Kruskal-Wallis test.
Plot the alpha diversity boxplot between the levels in selected condition.
alpha_div_boxplot(MAE = MAE,
tax_level = "genus",
condition = "Disease",
alpha_metric = "shannon")
Conduct statistical test on the alpha diversity between the levels in selected condition.
do_alpha_div_test(MAE = MAE,
tax_level = "genus",
condition = "Disease",
alpha_metric = "shannon",
alpha_stat = "T-test")
# Wilcoxon rank sum exact test Welch Two Sample t-test
# P-value 0.006682257 0.006483754
On the other hand, by defining distances between each sample, beta diversity is another key metric to look at. Users can plot the beta diversity heatmap by selecting different beta diversity dissimilarity metrics including Bray-Curtis and Jaccard. Users can also conduct beta diversity statistical testing between groups including PERMANOVA, Wilcoxon rank sum test and Kruskal-Wallis.
Plot the beta diversity heatmap with selected condition.
diversity_beta_heatmap(MAE = MAE,
tax_level = 'genus',
input_beta_method = "bray",
input_bdhm_select_conditions = 'Disease',
input_bdhm_sort_by = 'condition')
# Warning: 'layout' objects don't have these attributes: 'orientation'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Warning: 'layout' objects don't have these attributes: 'orientation'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Warning: 'layout' objects don't have these attributes: 'orientation'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Warning: 'layout' objects don't have these attributes: 'orientation'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
# Warning: 'layout' objects don't have these attributes: 'orientation'
# Valid attributes include:
# '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'
Plot the beta diversity boxplot within and between conditions.
diversity_beta_boxplot(MAE = MAE,
tax_level = 'genus',
input_beta_method = "bray",
input_select_beta_condition = 'Disease')
Conduct statistical test on the beta diversity between the levels in selected condition.
diversity_beta_test(MAE = MAE,
tax_level = 'genus',
input_beta_method = "bray",
input_select_beta_condition = 'Disease',
input_select_beta_stat_method = 'PERMANOVA',
input_num_permutation_permanova = 999)
# Permutation test for adonis under reduced model
# Terms added sequentially (first to last)
# Permutation: free
# Number of permutations: 999
#
# vegan::adonis2(formula = dist.mat ~ condition, data = sam_table, permutations = input_num_permutation_permanova)
# Df SumOfSqs R2 F Pr(>F)
# condition 1 1.1942 0.13939 4.535 0.002 **
# Residual 28 7.3730 0.86061
# Total 29 8.5671 1.00000
# ---
# Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
A wrapper for conduction 2D and 3D Principal Component Analysis.
result <- dimred_pca(MAE,
tax_level="genus",
color="age_s",
shape="Disease",
pcx=1,
pcy=2,
datatype="logcpm")
result$plot
head(result$table)
# PC Standard Deviation Variance Explained Cumulative Variance
# PC1 PC1 5.76 18.881% 18.88%
# PC2 PC2 4.54 11.732% 30.61%
# PC3 PC3 3.63 7.475% 38.09%
# PC4 PC4 3.53 7.066% 45.15%
# PC5 PC5 3.24 5.972% 51.12%
# PC6 PC6 2.95 4.943% 56.07%
A wrapper for conduction 2D and 3D Principal Coordinate Analysis.
result <- dimred_pcoa(MAE,
tax_level="genus",
color="age_s",
shape="Disease",
axx=1,
axy=2,
method="bray")
result$plot
head(result$table)
# Axis Eigenvalue Variance Explained Cumulative Variance
# Axis.1 Axis.1 3.550 30.456% 30.46%
# Axis.2 Axis.2 1.590 14.187% 44.64%
# Axis.3 Axis.3 1.120 10.303% 54.95%
# Axis.4 Axis.4 0.751 7.224% 62.17%
# Axis.5 Axis.5 0.381 4.155% 66.32%
# Axis.6 Axis.6 0.304 3.521% 69.85%
A wrapper for conduction 2D and 3D Uniform Manifold Approximation and Projection.
result <- dimred_umap(MAE,
tax_level="genus",
color="age_s",
shape="Disease",
cx=1,
cy=2,
n_neighbors=15,
metric="euclidean",
datatype="logcpm")
result$plot
A wrapper for conduction 2D and 3D t-distributed stochastic neighbor embedding.
# result <- dimred_tsne(MAE,
# tax_level="phylum",
# color="age_s",
# shape="Disease",
# k="3D",
# initial_dims=30,
# perplexity=10,
# datatype="logcpm")
# result$plot
Here in animalcules, we provide a DESeq2-based differential abundance analysis. Users can choose the target variable, covariate variable, taxonomy level, minimum count cut-off, and an adjusted p-value threshold. The analysis report will output not only the adjusted p-value and log2-fold-change of the microbes, but also the percentage, prevalence, and the group size-adjusted fold change.
p <- differential_abundance(MAE,
tax_level="phylum",
input_da_condition=c("Disease"),
min_num_filter = 2,
input_da_padj_cutoff = 0.5)
p
# microbe padj pValue log2FoldChange TB Control prevalence
# 1 Firmicutes 0.0936 0.0170 1.010 18/18 12/12 100.00%
# 2 Proteobacteria 0.0936 0.0109 1.970 17/18 12/12 96.67%
# 3 Bacteroidetes 0.1130 0.0307 -2.000 17/18 12/12 96.67%
# 4 Actinobacteria 0.1330 0.0484 -0.929 18/18 12/12 100.00%
# 5 Tenericutes 0.3350 0.1520 -2.610 5/18 3/12 26.67%
# 6 Cyanobacteria 0.4290 0.2340 -2.400 3/18 4/12 23.33%
# Group Size adjusted fold change
# 1 1.00
# 2 1.06
# 3 1.06
# 4 1.00
# 5 1.11
# 6 2.00
One unique feature of animalcules is the biomarker identification module built on machine learning models. Users can choose one classification model from logistic regression, gradient boosting machine, or random forest to identify a microbes biomarker list. The feature importance score for each microbe will be provided. To evaluate the biomarker performance, the ROC plot and the AUC value using cross-validation outputs are shown to users. Note: Results may vary each run.
p <- find_biomarker(MAE,
tax_level = "genus",
input_select_target_biomarker = c("Disease"),
nfolds = 3,
nrepeats = 3,
seed = 99,
percent_top_biomarker = 0.2,
model_name = "logistic regression")
# Warning: The following aesthetics were dropped during statistical transformation: m, d
# ℹ This can happen when ggplot fails to infer the correct grouping structure in
# the data.
# ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
# variable into a factor?
# biomarker
p$biomarker
# biomarker_list
# 1 Pseudoalteromonas
# 2 Pectobacterium
# 3 Erwinia
# 4 Streptobacillus
# 5 Bifidobacterium
# 6 Glutamicibacter
# 7 Sebaldella
# 8 Filifactor
# 9 Mageeibacillus
# 10 Prevotella
# 11 Arcanobacterium
# 12 Ruminococcus
# 13 Mycobacterium
# 14 Methylobacterium
# 15 Sphingomonas
# 16 Phenylobacterium
# 17 Paraburkholderia
# 18 Weissella
# 19 Blastococcus
# 20 Spirosoma
# 21 Mesorhizobium
# 22 Chelativorans
# 23 Acidiphilium
# 24 Pseudarthrobacter
# 25 Cryptobacterium
# 26 Moraxella
# 27 Caulobacter
# 28 Thiobacillus
# 29 Anaerostipes
# 30 Geobacillus
# 31 Methylomonas
# 32 Pseudopropionibacterium
# 33 Novosphingobium
# 34 Herbaspirillum
# 35 Streptococcus
# importance plot
p$importance_plot
# ROC plot
p$roc_plot
# Warning: The following aesthetics were dropped during statistical transformation: m, d
# ℹ This can happen when ggplot fails to infer the correct grouping structure in
# the data.
# ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
# variable into a factor?
sessionInfo()
# R version 4.3.0 RC (2023-04-13 r84269)
# Platform: x86_64-pc-linux-gnu (64-bit)
# Running under: Ubuntu 22.04.2 LTS
#
# Matrix products: default
# BLAS: /home/biocbuild/bbs-3.17-bioc/R/lib/libRblas.so
# LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
#
# locale:
# [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
# [3] LC_TIME=en_GB LC_COLLATE=C
# [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
#
# time zone: America/New_York
# tzcode source: system (glibc)
#
# attached base packages:
# [1] stats4 stats graphics grDevices utils datasets methods
# [8] base
#
# other attached packages:
# [1] caret_6.0-94 lattice_0.21-8
# [3] ggplot2_3.4.2 SummarizedExperiment_1.30.0
# [5] Biobase_2.60.0 GenomicRanges_1.52.0
# [7] GenomeInfoDb_1.36.0 IRanges_2.34.0
# [9] S4Vectors_0.38.0 BiocGenerics_0.46.0
# [11] MatrixGenerics_1.12.0 matrixStats_0.63.0
# [13] animalcules_1.16.0 testthat_3.1.7
# [15] BiocStyle_2.28.0
#
# loaded via a namespace (and not attached):
# [1] splines_4.3.0 later_1.3.0
# [3] bitops_1.0-7 tibble_3.2.1
# [5] hardhat_1.3.0 pROC_1.18.0
# [7] XML_3.99-0.14 rpart_4.1.19
# [9] rex_1.2.1 lifecycle_1.0.3
# [11] rprojroot_2.0.3 globals_0.16.2
# [13] processx_3.8.1 MASS_7.3-59
# [15] crosstalk_1.2.0 MultiAssayExperiment_1.26.0
# [17] magrittr_2.0.3 limma_3.56.0
# [19] plotly_4.10.1 sass_0.4.5
# [21] rmarkdown_2.21 jquerylib_0.1.4
# [23] yaml_2.3.7 remotes_2.4.2
# [25] httpuv_1.6.9 askpass_1.1
# [27] sessioninfo_1.2.2 pkgbuild_1.4.0
# [29] reticulate_1.28 RColorBrewer_1.1-3
# [31] lubridate_1.9.2 pkgload_1.3.2
# [33] zlibbioc_1.46.0 purrr_1.0.1
# [35] RCurl_1.98-1.12 nnet_7.3-18
# [37] ipred_0.9-14 lava_1.7.2.1
# [39] GenomeInfoDbData_1.2.10 ggrepel_0.9.3
# [41] rmutil_1.1.10 listenv_0.9.0
# [43] rentrez_1.2.3 vegan_2.6-4
# [45] umap_0.2.10.0 spatial_7.3-16
# [47] RSpectra_0.16-1 parallelly_1.35.0
# [49] permute_0.9-7 codetools_0.2-19
# [51] DelayedArray_0.26.0 DT_0.27
# [53] tidyselect_1.2.0 shape_1.4.6
# [55] farver_2.1.1 stable_1.1.6
# [57] jsonlite_1.8.4 ellipsis_0.3.2
# [59] survival_3.5-5 iterators_1.0.14
# [61] foreach_1.5.2 tools_4.3.0
# [63] Rcpp_1.0.10 glue_1.6.2
# [65] BiocBaseUtils_1.2.0 prodlim_2023.03.31
# [67] xfun_0.39 mgcv_1.8-42
# [69] DESeq2_1.40.0 usethis_2.1.6
# [71] dplyr_1.1.2 withr_2.5.0
# [73] timeSeries_4021.105 BiocManager_1.30.20
# [75] fastmap_1.1.1 rhdf5filters_1.12.0
# [77] fansi_1.0.4 shinyjs_2.1.0
# [79] openssl_2.0.6 callr_3.7.3
# [81] digest_0.6.31 timechange_0.2.0
# [83] R6_2.5.1 mime_0.12
# [85] colorspace_2.1-0 modeest_2.4.0
# [87] utf8_1.2.3 tidyr_1.3.0
# [89] generics_0.1.3 data.table_1.14.8
# [91] recipes_1.0.6 class_7.3-21
# [93] prettyunits_1.1.1 httr_1.4.5
# [95] htmlwidgets_1.6.2 ModelMetrics_1.2.2.2
# [97] pkgconfig_2.0.3 gtable_0.3.3
# [99] tsne_0.1-3.1 timeDate_4022.108
# [101] covr_3.6.2 XVector_0.40.0
# [103] brio_1.1.3 htmltools_0.5.5
# [105] profvis_0.3.7 bookdown_0.33
# [107] biomformat_1.28.0 clue_0.3-64
# [109] scales_1.2.1 png_0.1-8
# [111] gower_1.0.1 knitr_1.42
# [113] rstudioapi_0.14 reshape2_1.4.4
# [115] statip_0.2.3 nlme_3.1-162
# [117] plotROC_2.3.0 cachem_1.0.7
# [119] rhdf5_2.44.0 stringr_1.5.0
# [121] parallel_4.3.0 miniUI_0.1.1.1
# [123] fBasics_4022.94 desc_1.4.2
# [125] pillar_1.9.0 grid_4.3.0
# [127] vctrs_0.6.2 urlchecker_1.0.1
# [129] promises_1.2.0.1 xtable_1.8-4
# [131] cluster_2.1.4 evaluate_0.20
# [133] magick_2.7.4 cli_3.6.1
# [135] locfit_1.5-9.7 compiler_4.3.0
# [137] rlang_1.1.0 crayon_1.5.2
# [139] future.apply_1.10.0 labeling_0.4.2
# [141] ps_1.7.5 plyr_1.8.8
# [143] forcats_1.0.0 fs_1.6.2
# [145] stringi_1.7.12 viridisLite_0.4.1
# [147] BiocParallel_1.34.0 assertthat_0.2.1
# [149] munsell_0.5.0 lazyeval_0.2.2
# [151] devtools_2.4.5 glmnet_4.1-7
# [153] Matrix_1.5-4 stabledist_0.7-1
# [155] future_1.32.0 Rhdf5lib_1.22.0
# [157] statmod_1.5.0 shiny_1.7.4
# [159] highr_0.10 GUniFrac_1.7
# [161] memoise_2.0.1 bslib_0.4.2
# [163] ape_5.7-1