Skip to contents

The “dar” package is a versatile and user-friendly tool designed to accept inputs in a variety of formats. It primarily utilizes the phyloseq format but also supports the TreeSummarizedExperiment format. This flexibility allows users to conduct differential abundance analysis smoothly, irrespective of their initial data format. To facilitate this, a detailed guide is available to aid users in converting other prevalent data formats, such as biome, mothur, metaphlan, and more, into the necessary phyloseq or TreeSummarizedExperiment formats.

Importing Data from biome Format

The biome format is a commonly used format in bioinformatics to represent microbiome sequencing data. Here’s how you can import data in biome format to both phyloseq and TreeSummarizedExperiment.

To Phyloseq

To convert data from the biome format to the phyloseq format, you can use the phyloseq::import_biom() function. Here’s a step-by-step example of how to perform this conversion:

# Example of a rich dense biom file
rich_dense_biom  <-
  system.file("extdata", "rich_dense_otu_table.biom",  package = "phyloseq")

# Import biom as a phyloseq-class object
phy <- phyloseq::import_biom(
  rich_dense_biom,  
  parseFunction = parse_taxonomy_greengenes
)

phy
#> phyloseq-class experiment-level object
#> otu_table()   OTU Table:         [ 5 taxa and 6 samples ]
#> sample_data() Sample Data:       [ 6 samples by 4 sample variables ]
#> tax_table()   Taxonomy Table:    [ 5 taxa by 7 taxonomic ranks ]

# Print sample_data
phyloseq::sample_data(phy)
#>         BarcodeSequence  LinkerPrimerSequence BODY_SITE Description
#> Sample1    CGCTTATCGAGA CATGCTGCCTCCCGTAGGAGT       gut   human gut
#> Sample2    CATACCAGTAGC CATGCTGCCTCCCGTAGGAGT       gut   human gut
#> Sample3    CTCTCTACCTGT CATGCTGCCTCCCGTAGGAGT       gut   human gut
#> Sample4    CTCTCGGCCTGT CATGCTGCCTCCCGTAGGAGT      skin  human skin
#> Sample5    CTCTCTACCAAT CATGCTGCCTCCCGTAGGAGT      skin  human skin
#> Sample6    CTAACTACCAAT CATGCTGCCTCCCGTAGGAGT      skin  human skin

# Print tax_table
phyloseq::tax_table(phy)
#> Taxonomy Table:     [5 taxa by 7 taxonomic ranks]:
#>          Kingdom    Phylum           Class                 Order              
#> GG_OTU_1 "Bacteria" "Proteobacteria" "Gammaproteobacteria" "Enterobacteriales"
#> GG_OTU_2 "Bacteria" "Cyanobacteria"  "Nostocophycideae"    "Nostocales"       
#> GG_OTU_3 "Archaea"  "Euryarchaeota"  "Methanomicrobia"     "Methanosarcinales"
#> GG_OTU_4 "Bacteria" "Firmicutes"     "Clostridia"          "Halanaerobiales"  
#> GG_OTU_5 "Bacteria" "Proteobacteria" "Gammaproteobacteria" "Enterobacteriales"
#>          Family               Genus            Species                       
#> GG_OTU_1 "Enterobacteriaceae" "Escherichia"    NA                            
#> GG_OTU_2 "Nostocaceae"        "Dolichospermum" NA                            
#> GG_OTU_3 "Methanosarcinaceae" "Methanosarcina" NA                            
#> GG_OTU_4 "Halanaerobiaceae"   "Halanaerobium"  "Halanaerobiumsaccharolyticum"
#> GG_OTU_5 "Enterobacteriaceae" "Escherichia"    NA

# Recipe init
rec <- dar::recipe(phy) |>
  dar::add_model(~ BODY_SITE, targets = "BODY_SITE", tax_level = "Genus")

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 5 taxa and 6 samples 
#>       variable of interes BODY_SITE (class: character, levels: gut, skin) 
#>       taxonomic level Genus 
#> 
#> Statistical model:
#> 
#>       ~BODY_SITE

Inspecting Recipe Components

Recipe accessors expose the complete underlying components and do not depend on the targets or taxonomic level selected by add_model(). Their ordering is stable: samples follow phyloseq::sample_names(), taxa follow phyloseq::taxa_names(), and counts are always returned with taxa in rows.

dar::sample_data(rec)
#> # A tibble: 6 × 5
#>   sample_id BarcodeSequence LinkerPrimerSequence  BODY_SITE Description
#>   <chr>     <chr>           <chr>                 <chr>     <chr>      
#> 1 Sample1   CGCTTATCGAGA    CATGCTGCCTCCCGTAGGAGT gut       human gut  
#> 2 Sample2   CATACCAGTAGC    CATGCTGCCTCCCGTAGGAGT gut       human gut  
#> 3 Sample3   CTCTCTACCTGT    CATGCTGCCTCCCGTAGGAGT gut       human gut  
#> 4 Sample4   CTCTCGGCCTGT    CATGCTGCCTCCCGTAGGAGT skin      human skin 
#> 5 Sample5   CTCTCTACCAAT    CATGCTGCCTCCCGTAGGAGT skin      human skin 
#> 6 Sample6   CTAACTACCAAT    CATGCTGCCTCCCGTAGGAGT skin      human skin
dar::tax_table(rec)
#> # A tibble: 5 × 8
#>   taxa_id  Kingdom  Phylum         Class              Order Family Genus Species
#>   <chr>    <chr>    <chr>          <chr>              <chr> <chr>  <chr> <chr>  
#> 1 GG_OTU_1 Bacteria Proteobacteria Gammaproteobacter… Ente… Enter… Esch… NA     
#> 2 GG_OTU_2 Bacteria Cyanobacteria  Nostocophycideae   Nost… Nosto… Doli… NA     
#> 3 GG_OTU_3 Archaea  Euryarchaeota  Methanomicrobia    Meth… Metha… Meth… NA     
#> 4 GG_OTU_4 Bacteria Firmicutes     Clostridia         Hala… Halan… Hala… Halana…
#> 5 GG_OTU_5 Bacteria Proteobacteria Gammaproteobacter… Ente… Enter… Esch… NA
dar::otu_table(rec)
#> # A tibble: 5 × 7
#>   taxa_id  Sample1 Sample2 Sample3 Sample4 Sample5 Sample6
#>   <chr>      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
#> 1 GG_OTU_1       0       0       1       0       0       0
#> 2 GG_OTU_2       5       1       0       2       3       1
#> 3 GG_OTU_3       0       0       1       4       2       0
#> 4 GG_OTU_4       2       1       1       0       0       1
#> 5 GG_OTU_5       0       1       1       0       0       0

When sample metadata or taxonomy is absent, the corresponding accessor returns an ID-only tibble. Analysis engines use separate internal target and rank views, so additional metadata and taxonomy columns are not passed implicitly to a statistical method.

To TreeSummarizedExperiment

To convert data from the biome format to the TreeSummarizedExperiment format, you can use the mia::importBIOM() function. Here’s a step-by-step example of how to perform this conversion:

# Example of a rich dense biom file
rich_dense_biom  <-
  system.file("extdata", "rich_dense_otu_table.biom",  package = "phyloseq")

# Import biom as a phyloseq-class object
tse <- mia::importBIOM(rich_dense_biom)

tse
#> class: TreeSummarizedExperiment 
#> dim: 5 6 
#> metadata(0):
#> assays(1): counts
#> rownames(5): GG_OTU_1 GG_OTU_2 GG_OTU_3 GG_OTU_4 GG_OTU_5
#> rowData names(7): taxonomy1 taxonomy2 ... taxonomy6 taxonomy7
#> colnames(6): Sample1 Sample2 ... Sample5 Sample6
#> colData names(4): BarcodeSequence LinkerPrimerSequence BODY_SITE
#>   Description
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: NULL
#> rowTree: NULL
#> colLinks: NULL
#> colTree: NULL

# Print sample_data
colData(tse)
#> DataFrame with 6 rows and 4 columns
#>         BarcodeSequence  LinkerPrimerSequence   BODY_SITE Description
#>             <character>           <character> <character> <character>
#> Sample1    CGCTTATCGAGA CATGCTGCCTCCCGTAGGAGT         gut   human gut
#> Sample2    CATACCAGTAGC CATGCTGCCTCCCGTAGGAGT         gut   human gut
#> Sample3    CTCTCTACCTGT CATGCTGCCTCCCGTAGGAGT         gut   human gut
#> Sample4    CTCTCGGCCTGT CATGCTGCCTCCCGTAGGAGT        skin  human skin
#> Sample5    CTCTCTACCAAT CATGCTGCCTCCCGTAGGAGT        skin  human skin
#> Sample6    CTAACTACCAAT CATGCTGCCTCCCGTAGGAGT        skin  human skin

# Print tax_table
rowData(tse)
#> DataFrame with 5 rows and 7 columns
#>            taxonomy1         taxonomy2              taxonomy3
#>          <character>       <character>            <character>
#> GG_OTU_1 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> GG_OTU_2 k__Bacteria  p__Cyanobacteria    c__Nostocophycideae
#> GG_OTU_3  k__Archaea  p__Euryarchaeota     c__Methanomicrobia
#> GG_OTU_4 k__Bacteria     p__Firmicutes          c__Clostridia
#> GG_OTU_5 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#>                     taxonomy4             taxonomy5         taxonomy6
#>                   <character>           <character>       <character>
#> GG_OTU_1 o__Enterobacteriales f__Enterobacteriaceae    g__Escherichia
#> GG_OTU_2        o__Nostocales        f__Nostocaceae g__Dolichospermum
#> GG_OTU_3 o__Methanosarcinales f__Methanosarcinaceae g__Methanosarcina
#> GG_OTU_4   o__Halanaerobiales   f__Halanaerobiaceae  g__Halanaerobium
#> GG_OTU_5 o__Enterobacteriales f__Enterobacteriaceae    g__Escherichia
#>                       taxonomy7
#>                     <character>
#> GG_OTU_1                    s__
#> GG_OTU_2                    s__
#> GG_OTU_3                    s__
#> GG_OTU_4 s__Halanaerobiumsacc..
#> GG_OTU_5                    s__

# Change the column names of the tax_table
colnames(rowData(tse)) <- 
  c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")

rowData(tse)
#> DataFrame with 5 rows and 7 columns
#>              Kingdom            Phylum                  Class
#>          <character>       <character>            <character>
#> GG_OTU_1 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#> GG_OTU_2 k__Bacteria  p__Cyanobacteria    c__Nostocophycideae
#> GG_OTU_3  k__Archaea  p__Euryarchaeota     c__Methanomicrobia
#> GG_OTU_4 k__Bacteria     p__Firmicutes          c__Clostridia
#> GG_OTU_5 k__Bacteria p__Proteobacteria c__Gammaproteobacteria
#>                         Order                Family             Genus
#>                   <character>           <character>       <character>
#> GG_OTU_1 o__Enterobacteriales f__Enterobacteriaceae    g__Escherichia
#> GG_OTU_2        o__Nostocales        f__Nostocaceae g__Dolichospermum
#> GG_OTU_3 o__Methanosarcinales f__Methanosarcinaceae g__Methanosarcina
#> GG_OTU_4   o__Halanaerobiales   f__Halanaerobiaceae  g__Halanaerobium
#> GG_OTU_5 o__Enterobacteriales f__Enterobacteriaceae    g__Escherichia
#>                         Species
#>                     <character>
#> GG_OTU_1                    s__
#> GG_OTU_2                    s__
#> GG_OTU_3                    s__
#> GG_OTU_4 s__Halanaerobiumsacc..
#> GG_OTU_5                    s__

# Recipe init
rec <- dar::recipe(tse) |>
  dar::add_model(~ BODY_SITE, targets = "BODY_SITE", tax_level = "Genus")

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 5 taxa and 6 samples 
#>       variable of interes BODY_SITE (class: character, levels: gut, skin) 
#>       taxonomic level Genus 
#> 
#> Statistical model:
#> 
#>       ~BODY_SITE

Importing Data from qiime Format

The qiime format is another commonly used format in bioinformatics for microbiome sequencing data. Here’s how you can import data in qiime format to both Phyloseq and TreeSummarizedExperiment.

To Phyloseq

To convert data from the qiime format to the Phyloseq format, you can use the phyloseq::import_qiime() function. Here’s a step-by-step example of how to perform this conversion:

# Import QIIME data
phy_qiime <- phyloseq::import_qiime(
  otufilename = system.file("extdata", "GP_otu_table_rand_short.txt.gz", package = "phyloseq"),
  mapfilename = system.file("extdata", "master_map.txt", package = "phyloseq"),
  treefilename = system.file("extdata", "GP_tree_rand_short.newick.gz", package = "phyloseq")
)
#> Processing map file...
#> Processing otu/tax file...
#> Reading file into memory prior to parsing...
#> Detecting first header line...
#> Header is on line 2  
#> Converting input file to a table...
#> Defining OTU table... 
#> Parsing taxonomy table...
#> Processing phylogenetic tree...
#>  /__w/_temp/Library/phyloseq/extdata/GP_tree_rand_short.newick.gz ...

phy_qiime
#> phyloseq-class experiment-level object
#> otu_table()   OTU Table:         [ 500 taxa and 26 samples ]
#> sample_data() Sample Data:       [ 26 samples by 7 sample variables ]
#> tax_table()   Taxonomy Table:    [ 500 taxa by 7 taxonomic ranks ]
#> phy_tree()    Phylogenetic Tree: [ 500 tips and 499 internal nodes ]

# Recipe init
rec <- dar::recipe(phy_qiime) |>
  dar::add_model(~ SampleType, targets = "SampleType", tax_level = "Genus")

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 500 taxa and 26 samples 
#>       variable of interes SampleType (class: character, levels: Feces, Freshwater, Freshwater (creek), Mock, Ocean, Sediment (estuary), Skin, Soil, Tongue) 
#>       taxonomic level Genus 
#> 
#> Statistical model:
#> 
#>       ~SampleType

To TreeSummarizedExperiment

To convert data from the qiime format to the TreeSummarizedExperiment format, you can use the mia::importQIIME2() function. Here’s a step-by-step example of how to perform this conversion:

# Import QIIME data to tse
tse_qiime <- mia::importQIIME2(
  featureTableFile = system.file("extdata", "table.qza", package = "mia"),
  taxonomyTableFile = system.file("extdata", "taxonomy.qza", package = "mia"),
  sampleMetaFile = system.file("extdata", "sample-metadata.tsv", package = "mia"),
  refSeqFile = system.file("extdata", "refseq.qza", package = "mia"),
  phyTreeFile = system.file("extdata", "tree.qza", package = "mia")
)

tse_qiime

# Recipe init
rec <- dar::recipe(tse_qiime) |>
  dar::add_model(~ body.site, targets = "body.site", tax_level = "Genus")

rec

Importing Data from mothur Format

The mothur format is another commonly used format in bioinformatics for microbiome sequencing data. Here’s how you can import data in mothur format to both Phyloseq and TreeSummarizedExperiment.

To Phyloseq

To convert data from the mothur format to the Phyloseq format, you can use the phyloseq::import_mothur() function. Here’s a step-by-step example of how to perform this conversion:

# Import Mothur data
phy_mothur <- phyloseq::import_mothur(
  mothur_list_file = system.file("extdata", "esophagus.fn.list.gz", package = "phyloseq"),
  mothur_group_file = system.file("extdata", "esophagus.good.groups.gz", package = "phyloseq"),
  mothur_tree_file = system.file("extdata", "esophagus.tree.gz", package = "phyloseq")
)

phy_mothur
#> phyloseq-class experiment-level object
#> otu_table()   OTU Table:         [ 591 taxa and 3 samples ]
#> phy_tree()    Phylogenetic Tree: [ 591 tips and 590 internal nodes ]

# Recipe init
rec <- dar::recipe(phy_mothur)

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 591 taxa and 3 samples 
#>       undefined analysis target. Use add_model() to define the analysis! 
#>       undefined taxonomic level. Use add_model() to define the analysis!

To TreeSummarizedExperiment

To convert data from the mothur format to the TreeSummarizedExperiment format, you can use the mia::importMothur() function. Here’s a step-by-step example of how to perform this conversion:

# Import Mothur data to TreeSummarizedExperiment
tse_mothur <- mia::importMothur(
  sharedFile = system.file("extdata", "mothur_example.shared", package = "mia"),
  taxonomyFile = system.file("extdata", "mothur_example.cons.taxonomy", package = "mia"),
  designFile = system.file("extdata", "mothur_example.design", package = "mia")
) |> methods::as("TreeSummarizedExperiment")

tse_mothur
#> class: TreeSummarizedExperiment 
#> dim: 100 100 
#> metadata(0):
#> assays(1): counts
#> rownames(100): Otu001 Otu002 ... Otu099 Otu100
#> rowData names(8): OTU Size ... Family Genus
#> colnames(100): Sample1 Sample2 ... Sample99 Sample100
#> colData names(7): group sex ... numOtus Group
#> reducedDimNames(0):
#> mainExpName: NULL
#> altExpNames(0):
#> rowLinks: NULL
#> rowTree: NULL
#> colLinks: NULL
#> colTree: NULL

# Recipe init
rec <- dar::recipe(tse_mothur) |>
  dar::add_model(~ drug, targets = "drug", tax_level = "Genus")

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 100 taxa and 100 samples 
#>       variable of interes drug (class: character, levels: A, B) 
#>       taxonomic level Genus 
#> 
#> Statistical model:
#> 
#>       ~drug

Importing Data from metaphlan Format

The metaphlan format is another commonly used format in bioinformatics for microbiome sequencing data. Here’s how you can import data in metaphlan format to TreeSummarizedExperiment.

To TreeSummarizedExperiment

To convert data from the metaphlan format to the TreeSummarizedExperiment format, you can use the mia::importMetaPhlAn() function. Here’s a step-by-step example of how to perform this conversion:

# Importing data from Metaphlan
tse_metaphlan <- mia::importMetaPhlAn(
  file = system.file("extdata", "merged_abundance_table.txt", package = "mia")
)

# Recipe init
tse_metaphlan <- TreeSummarizedExperiment::TreeSummarizedExperiment(
  assays = list(counts = SummarizedExperiment::assay(tse_metaphlan)),
  rowData = SummarizedExperiment::rowData(tse_metaphlan),
  colData = SummarizedExperiment::colData(tse_metaphlan) |> 
    as.data.frame() |> 
    dplyr::mutate(condition = rep(c("A", "B"), times = 3))
)

rec <- dar::recipe(tse_metaphlan) |>
  dar::add_model(~ condition, targets = "condition", tax_level = "Genus")

rec
#> ── DAR Recipe ──────────────────────────────────────────────────────────────────
#> Inputs:
#> 
#>       phyloseq object with 16 taxa and 6 samples 
#>       variable of interes condition (class: character, levels: A, B) 
#>       taxonomic level Genus 
#> 
#> Statistical model:
#> 
#>       ~condition

Conclusion

In this guide, we have explored various methods for importing microbiome sequencing data from different formats into Phyloseq and TreeSummarizedExperiment. We’ve covered the biome, qiime, mothur, metaphlan, and humann formats, providing step-by-step examples for each.

The flexibility of these tools allows for a smooth transition between different data formats, making it easier to conduct your analysis irrespective of the initial data format. By following the steps outlined in this guide, you should be able to successfully convert your data and carry out further differential abundance analysis.

Remember, the specific details of your data may require you to adjust the parameters in the import functions. Always inspect your data after conversion to ensure it has been imported correctly.

Session info

devtools::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.6.1 (2026-06-24)
#>  os       Ubuntu 24.04.4 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       UTC
#>  date     2026-08-04
#>  pandoc   3.10 @ /usr/bin/ (via rmarkdown)
#>  quarto   1.9.38 @ /usr/local/bin/quarto
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package                  * version date (UTC) lib source
#>  abind                      1.4-8   2024-09-12 [1] RSPM (R 4.6.0)
#>  ade4                       1.7-24  2026-03-21 [1] RSPM (R 4.6.0)
#>  ape                        5.8-1   2024-12-16 [1] RSPM (R 4.6.0)
#>  backports                  1.5.1   2026-04-03 [1] RSPM (R 4.6.0)
#>  beachmat                   2.29.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  beeswarm                   0.4.0   2021-06-01 [1] RSPM (R 4.6.0)
#>  Biobase                  * 2.73.2  2026-07-29 [1] Bioconductor 3.24 (R 4.6.1)
#>  BiocGenerics             * 0.59.10 2026-07-07 [1] Bioconductor 3.24 (R 4.6.1)
#>  BiocNeighbors              2.7.2   2026-05-10 [1] Bioconductor 3.24 (R 4.6.1)
#>  BiocParallel               1.47.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  BiocSingular               1.29.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  biomformat                 1.41.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  Biostrings               * 2.81.6  2026-07-30 [1] Bioconductor 3.24 (R 4.6.1)
#>  bluster                    1.23.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  bslib                      0.12.0  2026-08-04 [2] RSPM (R 4.6.0)
#>  cachem                     1.1.0   2024-05-16 [2] RSPM (R 4.6.0)
#>  checkmate                  2.3.4   2026-02-03 [1] RSPM (R 4.6.0)
#>  cli                        3.6.6   2026-04-09 [2] RSPM (R 4.6.0)
#>  cluster                    2.1.8.3 2026-07-30 [2] RSPM (R 4.6.0)
#>  codetools                  0.2-20  2024-03-31 [3] CRAN (R 4.6.1)
#>  crayon                     1.5.3   2024-06-20 [2] RSPM (R 4.6.0)
#>  dar                        1.9.12  2026-08-04 [1] Bioconductor
#>  data.table                 1.18.4  2026-05-06 [1] RSPM (R 4.6.0)
#>  DBI                        1.3.0   2026-02-25 [1] RSPM (R 4.6.0)
#>  DECIPHER                   3.9.2   2026-07-30 [1] Bioconductor 3.24 (R 4.6.1)
#>  decontam                   1.33.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  DelayedArray               0.39.3  2026-06-01 [1] Bioconductor 3.24 (R 4.6.1)
#>  DelayedMatrixStats         1.35.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  desc                       1.4.3   2023-12-10 [2] RSPM (R 4.6.0)
#>  devtools                   2.5.2   2026-04-30 [2] RSPM (R 4.6.0)
#>  digest                     0.6.39  2025-11-19 [2] RSPM (R 4.6.0)
#>  DirichletMultinomial       1.55.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  dplyr                      1.2.1   2026-04-03 [1] RSPM (R 4.6.0)
#>  ellipsis                   0.3.3   2026-04-04 [2] RSPM (R 4.6.0)
#>  evaluate                   1.0.5   2025-08-27 [2] RSPM (R 4.6.0)
#>  farver                     2.1.2   2024-05-13 [1] RSPM (R 4.6.0)
#>  fastmap                    1.2.0   2024-05-15 [2] RSPM (R 4.6.0)
#>  foreach                    1.5.2   2022-02-02 [1] RSPM (R 4.6.0)
#>  fs                         2.1.0   2026-04-18 [2] RSPM (R 4.6.0)
#>  generics                 * 0.1.4   2025-05-09 [1] RSPM (R 4.6.0)
#>  GenomicRanges            * 1.65.1  2026-07-08 [1] Bioconductor 3.24 (R 4.6.1)
#>  ggbeeswarm                 0.7.3   2025-11-29 [1] RSPM (R 4.6.0)
#>  ggplot2                    4.0.3   2026-04-22 [1] RSPM (R 4.6.0)
#>  ggrepel                    0.9.8   2026-03-17 [1] RSPM (R 4.6.0)
#>  glue                       1.8.1   2026-04-17 [2] RSPM (R 4.6.0)
#>  gridExtra                  2.3.1   2026-06-25 [1] RSPM (R 4.6.0)
#>  gtable                     0.3.6   2024-10-25 [1] RSPM (R 4.6.0)
#>  htmltools                  0.5.9   2025-12-04 [2] RSPM (R 4.6.0)
#>  htmlwidgets                1.6.4   2023-12-06 [2] RSPM (R 4.6.0)
#>  igraph                     2.3.3   2026-06-26 [1] RSPM (R 4.6.0)
#>  IRanges                  * 2.47.2  2026-06-01 [1] Bioconductor 3.24 (R 4.6.1)
#>  irlba                      2.3.7   2026-01-30 [1] RSPM (R 4.6.0)
#>  iterators                  1.0.14  2022-02-05 [1] RSPM (R 4.6.0)
#>  jquerylib                  0.1.4   2021-04-26 [2] RSPM (R 4.6.0)
#>  jsonlite                   2.0.0   2025-03-27 [2] RSPM (R 4.6.0)
#>  knitr                      1.51    2025-12-20 [2] RSPM (R 4.6.0)
#>  lattice                    0.22-9  2026-02-09 [3] CRAN (R 4.6.1)
#>  lazyeval                   0.2.3   2026-04-04 [1] RSPM (R 4.6.0)
#>  lifecycle                  1.0.5   2026-01-08 [2] RSPM (R 4.6.0)
#>  magrittr                   2.0.5   2026-04-04 [2] RSPM (R 4.6.0)
#>  MASS                       7.3-66  2026-07-15 [2] RSPM (R 4.6.0)
#>  Matrix                     1.7-6   2026-07-25 [2] RSPM (R 4.6.0)
#>  MatrixGenerics           * 1.25.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  matrixStats              * 1.5.0   2025-01-07 [1] RSPM (R 4.6.0)
#>  memoise                    2.0.1   2021-11-26 [2] RSPM (R 4.6.0)
#>  mgcv                       1.9-4   2025-11-07 [3] CRAN (R 4.6.1)
#>  mia                      * 1.21.6  2026-07-31 [1] Bioconductor 3.24 (R 4.6.1)
#>  MultiAssayExperiment     * 1.39.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  multtest                   2.69.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  nlme                       3.1-170 2026-07-15 [2] RSPM (R 4.6.0)
#>  otel                       0.2.0   2025-08-29 [2] RSPM (R 4.6.0)
#>  permute                    0.9-10  2026-02-06 [1] RSPM (R 4.6.0)
#>  phyloseq                 * 1.57.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  pillar                     1.11.1  2025-09-17 [2] RSPM (R 4.6.0)
#>  pkgbuild                   1.4.8   2025-05-26 [2] RSPM (R 4.6.0)
#>  pkgconfig                  2.0.3   2019-09-22 [2] RSPM (R 4.6.0)
#>  pkgdown                    2.2.1   2026-07-07 [2] RSPM (R 4.6.0)
#>  pkgload                    1.5.3   2026-06-15 [2] RSPM (R 4.6.0)
#>  plyr                       1.8.9   2023-10-02 [1] RSPM (R 4.6.0)
#>  purrr                      1.2.2   2026-04-10 [2] RSPM (R 4.6.0)
#>  R6                         2.6.1   2025-02-15 [2] RSPM (R 4.6.0)
#>  ragg                       1.5.2   2026-03-23 [2] RSPM (R 4.6.0)
#>  rappdirs                   0.3.4   2026-01-17 [2] RSPM (R 4.6.0)
#>  rbibutils                  2.4.1   2026-01-21 [1] RSPM (R 4.6.0)
#>  RColorBrewer               1.1-3   2022-04-03 [1] RSPM (R 4.6.0)
#>  Rcpp                       1.1.2   2026-07-05 [2] RSPM (R 4.6.0)
#>  Rdpack                     2.6.6   2026-02-08 [1] RSPM (R 4.6.0)
#>  reformulas                 0.4.4   2026-02-02 [1] RSPM (R 4.6.0)
#>  reshape2                   1.4.5   2025-11-12 [1] RSPM (R 4.6.0)
#>  rlang                      1.3.0   2026-07-05 [2] RSPM (R 4.6.0)
#>  rmarkdown                  2.31    2026-03-26 [2] RSPM (R 4.6.0)
#>  rsvd                       1.0.5   2021-04-16 [1] RSPM (R 4.6.0)
#>  S4Arrays                   1.13.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  S4Vectors                * 0.51.6  2026-07-29 [1] Bioconductor 3.24 (R 4.6.1)
#>  S7                         0.2.2   2026-04-22 [1] CRAN (R 4.6.1)
#>  sass                       0.4.10  2025-04-11 [2] RSPM (R 4.6.0)
#>  ScaledMatrix               1.21.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  scales                     1.4.0   2025-04-24 [1] RSPM (R 4.6.0)
#>  scater                     1.41.2  2026-06-30 [1] Bioconductor 3.24 (R 4.6.1)
#>  scuttle                    1.23.1  2026-05-18 [1] Bioconductor 3.24 (R 4.6.1)
#>  Seqinfo                  * 1.3.0   2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  sessioninfo                1.2.4   2026-06-04 [2] RSPM (R 4.6.0)
#>  SingleCellExperiment     * 1.35.2  2026-07-16 [1] Bioconductor 3.24 (R 4.6.1)
#>  SparseArray                1.13.2  2026-05-01 [1] Bioconductor 3.24 (R 4.6.1)
#>  sparseMatrixStats          1.25.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  stringi                    1.8.7   2025-03-27 [2] RSPM (R 4.6.0)
#>  stringr                    1.6.0   2025-11-04 [1] RSPM (R 4.6.0)
#>  SummarizedExperiment     * 1.43.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  survival                   3.8-9   2026-07-08 [2] RSPM (R 4.6.0)
#>  systemfonts                1.3.2   2026-03-05 [2] RSPM (R 4.6.0)
#>  textshaping                1.0.5   2026-03-06 [2] RSPM (R 4.6.0)
#>  tibble                     3.3.1   2026-01-11 [2] RSPM (R 4.6.0)
#>  tidyr                      1.3.2   2025-12-19 [1] RSPM (R 4.6.0)
#>  tidyselect                 1.2.1   2024-03-11 [1] RSPM (R 4.6.0)
#>  tidytree                   0.4.8   2026-07-02 [1] RSPM (R 4.6.0)
#>  treeio                     1.37.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  TreeSummarizedExperiment * 2.21.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  usethis                    3.2.1   2025-09-06 [2] RSPM (R 4.6.0)
#>  utf8                       1.2.6   2025-06-08 [2] RSPM (R 4.6.0)
#>  vctrs                      0.7.3   2026-04-11 [2] RSPM (R 4.6.0)
#>  vegan                      2.7-5   2026-05-25 [1] RSPM (R 4.6.0)
#>  vipor                      0.4.7   2023-12-18 [1] RSPM (R 4.6.0)
#>  viridis                    0.6.5   2024-01-29 [1] RSPM (R 4.6.0)
#>  viridisLite                0.4.3   2026-02-04 [1] RSPM (R 4.6.0)
#>  withr                      3.0.3   2026-06-19 [2] RSPM (R 4.6.0)
#>  xfun                       0.60    2026-07-09 [2] RSPM (R 4.6.0)
#>  XVector                  * 0.53.0  2026-04-28 [1] Bioconductor 3.24 (R 4.6.1)
#>  yaml                       2.3.12  2025-12-10 [2] RSPM (R 4.6.0)
#>  yulab.utils                0.2.4   2026-02-02 [1] RSPM (R 4.6.0)
#> 
#>  [1] /__w/_temp/Library
#>  [2] /usr/local/lib/R/site-library
#>  [3] /usr/local/lib/R/library
#>  * ── Packages attached to the search path.
#> 
#> ──────────────────────────────────────────────────────────────────────────────