# RFLOMICS Command line

# Introduction

RFLOMICS is a R package that provides a complete workflow for the analysis of multi-omics data within complex experimental designs framework. The package was originally designed to be used through a user interface (see `RFLOMICS` vignette), but has been developed in an object oriented programming with a limited number of classes and methods. This allow to run data analysis as command line in a workflow with the “|>” operator, each step being a method of the extended MultiAssayExperiment or SummarizedExperiment classes.

# The RflomicsMAE and RflomicsSE classes

To ensure efficient data management the MultiAssayExperiment and SummarizedExperiment classes were extended to fix an organization for the metadata slot. The statistical design and analysis parameters of the multi-omics data integration are stored in the `metadata` slot of the `RflomicsMAE` class, while the parameters and results of the single-omics are stored in the `metadata` slot of `RflomicsSE` objects of the `ExperimentList`.

This organization can be illustrated by presenting the workflow of the RFLOMICS package.

The workflow is structured in three main parts:

- The first consists of loading the experimental design and omics data, setting up the statistical model and defining the contrasts (hypotheses) associated with the biological questions. The design list of the metadata slot of the RflomicsMAE object stores this statistical settings (in green in Fig 1).

Fig 1: Organization of the metadata slot of the RflomicsMAE object

- The second part allows a complete single-omics analysis for each dataset. The raw and processed omic datasets are stored in the ExperimentList as RflomicsSE. For each analysis step, settings and results are stored (in green in Fig 2)

  1. The DataProcessing list in the metadata slot contains the parameters and results of pre-processing including filtering, normalization and transformation

  2. The DiffExpAnal list in the metadata slot contains the parameters and results of the differential expression analysis.

  3. The CoExpAnal list in the metadata slot stores the parameters and results of the coexpression analysis on differentially expressed entities.

  4. DiffExpEnrichAnal and CoExpEnrichAnal lists in the metadata slot store the results and parameters of the functional enrichment analysis for the differential expression and the coexpression analysis, respectively.

Fig 2: Organization of the metadata slot of the RflomicsSE objects

- The third part is the multi-omics integration, with two proposed methods: a supervised approach using the mixOmics package (DIABLO), and an unsupervised approach using MOFA2. (settings and results stored in RflomicsMAE object)

Fig 3: storage of multi-omics integration settings and results in the metadata slot of the RflomicsMAE object

As you will see, this analysis workflow is implemented as methods of the two classes (`RflomicsMAE` and `RflomicsSE`), providing a generic interface whatever the type of omics data being analyzed (RNAseq, proteomics, metabolomics, etc.). These methods return the same class as the input object (`RflomicsMAE` and `RflomicsSE`) with the metadata slot enriched with parameters and results. Getter and Setter methods have been defined to access the metadata objects.

# Methods for RflomicsMAE and RflomicsSE classes

## Instantiating a RflomicsMAE object from a MAE object

In this example we will instantiate a RflomicsMAE object from an existing MAE object and a design data.frame. We will use the ecoseed dataset from the RFLOMICS package (see `data(ecoseed)`).

`ecoseed` is a multi-omics dataset composed of three data matrices: transcriptomics (raw RNAseq read count data matrix), metabolomics and proteomics (relative abundance matrix as XIC) obtained from a study examining the effect of seed production temperature on the germination potential of Arabidopsis thaliana.

The experimental design includes three factors:

- Repeat: batch factor: rep1, rep2, rep3

- temperature: biological factor with three conditions: Low, Medium, Elevated

- imbibition: biological factor with three conditions: DS (Dry Deed), EI (Early Imbibition), LI (Late Imbibition)

Crucial information is needed to complete the design and create the RflomicsMAE object. Experimental factors must be defined with their type (batch or biological) and a reference level. These information are used to automatically generate the statistical design.

PCA on raw data is performed during the instantiation of the RflomicsMAE object.

    data(ecoseed.mae)

    factorInfo <- data.frame(
      "factorName"   = c("Repeat", "temperature", "imbibition"),
      "factorType"   = c("batch", "Bio", "Bio"),
      "factorRef"    = c("rep1", "Low", "DS")
    )

    # create rflomicsMAE object with ecoseed data
    MAE <- createRflomicsMAE(
      projectName = "Tests",
      omicsData   =  ecoseed.mae,
      omicsTypes  = c("RNAseq", "proteomics", "metabolomics"),
      factorInfo  = factorInfo
    )

    names(metadata(MAE))
    #> [1] "omicList"            "projectName"         "design"
    #> [4] "IntegrationAnalysis" "date"                "sessionInfo"
    #> [7] "rflomicsVersion"     "color"

    head(getDesignMat(MAE))
    #>             Repeat    groups temperature imbibition     samples
    #> Low_DS_1      rep1    Low_DS         Low         DS    Low_DS_1
    #> Low_DS_2      rep2    Low_DS         Low         DS    Low_DS_2
    #> Low_DS_3      rep3    Low_DS         Low         DS    Low_DS_3
    #> Medium_DS_1   rep1 Medium_DS      Medium         DS Medium_DS_1
    #> Medium_DS_2   rep2 Medium_DS      Medium         DS Medium_DS_2
    #> Medium_DS_3   rep3 Medium_DS      Medium         DS Medium_DS_3

## Overview of the main methods

Omics data is heterogeneous and each omics requires specific methods and parameters to take into account of the nature of data. RFLOMICS has a set of generic methods than can be applied to the `RflomicsMAE` or `RflomicsSE` objects and which adapt the methods and parameters to the type of omics data: RNAseq, proteomics, metabolomics.

The main methods are:

Methods | Description
--- | ---
`createRflomicsMAE` | instantiate a `RflomicsMAE` object from a `MAE` object and a design data.frame
`runDataProcessing` | Process data: filtering: features or samples, normalization and/or transformation, PCA
`runDiffAnalysis` | perform a Differential features analysis on omics data
`runCoExpression` | perform a CoExpression analysis from the union/intersection of differentially expressed features list.
`runAnnotationEnrichment` | perform an annotation enrichment analysis (GO, KEGG, custom) on the list of differentially or co-expressed features
`runOmicsIntegration` | perform an integration analysis (MOFA or DIABLO)
`generateReport` | generate a report from the RflomicsMAE object and optionally export the report and results

Table 1: Main methods of the RflomicsMAE and RflomicsSE classes for running a multi-omics analysis workflow.

When applied to a `RflomicsMAE` object, the name of the `RflomicsSE` object must be specified with the `SE.name` parameter.

## Executing the workflow :

### Define the statistical settings: model and contrasts

The next step is to define the model and associated contrasts by translating the biological question into statistical terms. The `generateModelFormulae` function is used to find all possible models given the experimental design settings.

Rflomics accepts up to three biological factors and one batch effect. Only second-order interaction terms between biological factors will appear in the model formulae. Batch factors will never appear in the interaction terms. For the rest of the example, we choose the second formula. The model without the interaction term.

- set the model formulae

    form <- generateModelFormulae(MAE)
    form
    #> $`~Repeat + temperature + imbibition + temperature:imbibition`
    #> ~Repeat + temperature + imbibition + temperature:imbibition
    #> <environment: 0x55f77582a900>
    #>
    #> $`~Repeat + temperature + imbibition`
    #> ~Repeat + temperature + imbibition
    #> <environment: 0x55f77582a900>

    MAE <- setModelFormula(MAE, form[2])

    getModelFormula(MAE)
    #> [1] "~Repeat + temperature + imbibition"

Given the formula chosen, all the hypotheses (contrasts) can be obtained using the `generateExpressionContrast` function. Three types of contrast are expressed: pairwise comparison, average expression and interaction expression.

In this example, we will select the first three contrasts from the averaged contrasts.

- set contrasts:

    possibleContrasts <- generateExpressionContrast(MAE)
    possibleContrasts$averaged$contrastName
    #> [1] "(temperatureMedium - temperatureLow) in mean"
    #> [2] "(temperatureElevated - temperatureLow) in mean"
    #> [3] "(temperatureElevated - temperatureMedium) in mean"
    #> [4] "(imbibitionEI - imbibitionDS) in mean"
    #> [5] "(imbibitionLI - imbibitionDS) in mean"
    #> [6] "(imbibitionLI - imbibitionEI) in mean"

    MAE <- setSelectedContrasts(MAE, contrastList = possibleContrasts$averaged[1:3])

    getSelectedContrasts(MAE)[, -c(1, 3)]
    #>                                         contrastName   type    tag
    #>                                               <char> <char> <char>
    #> 1:      (temperatureMedium - temperatureLow) in mean   mean     H1
    #> 2:    (temperatureElevated - temperatureLow) in mean   mean     H2
    #> 3: (temperatureElevated - temperatureMedium) in mean   mean     H3

This statistical framework will be applied on all loaded datasets.

### Single-omics analysis

#### Data processing and quality control

Data processing, including normalization and transformation parameters and results, can be carried out in a single step using the `runDataProcessing` method. Or in several steps using the methods called by `runDataProcessing`, which are:`filterLowAbundance` (`RNAseq`), `runNormalization` and `runTransformData`.

In this example, the three omics data sets are processed in a single step.

    MAE <- runDataProcessing(
      object = MAE,
      SE.name = "RNAtest",
      samples = colnames(MAE[["RNAtest"]])[-1],
      lowCountFilter = list(filterMethod = "CPM", filterStrategy = "NbReplicates", cpmCutoff = 1),
      normalize = list(normMethod = "TMM")
    ) |>
      runDataProcessing(
        SE.name = "metatest",
        normalize = list(normMethod = "median"),
        transform = list(transformMethod = "log2")
      ) |>
      runDataProcessing(
        SE.name = "protetest",
        normalize = list(normMethod = "none"),
        transform = list(transformMethod = "log2")
      ) |>
      runOmicsPCA(SE.name = "metatest")

    # Access to the normalization settings for metabolomics data

    getNormSettings(object = MAE[["metatest"]])
    #> $method
    #> [1] "median"
    #>
    #> $suppInfo
    #> NULL

    # Obtain the list of filtered features for the RNAseq data

    getFilteredFeatures(object = MAE[["RNAtest"]])[1:10]
    #>  [1] "AT1G01070" "AT1G01150" "AT1G01280" "AT1G01305" "AT1G01380" "AT1G01390"
    #>  [7] "AT1G01410" "AT1G01453" "AT1G01460" "AT1G01471"

It is important to note that none of the data is directly transformed in the assay, unless the user specifically requests it by setting the `modifyAssay` argument to TRUE. This way, you can always change your mind and test several normalisation or transformation processes.

You can access to processing results and plot them.

    plotOmicsPCA(MAE[["metatest"]], raw = TRUE)
    plotOmicsPCA(MAE[["metatest"]], raw = FALSE)

    plotDataDistribution(MAE[["metatest"]], raw = TRUE)
    plotDataDistribution(MAE[["metatest"]], raw = FALSE)

#### Differential analysis: settings and results

Differential analysis on each contrasts can be performed using the `runDiffAnalysis` method. This method is specialized for each omics type and uses the `limma` package for proteomics and metabolomics data and the `edgeR` package for RNAseq data. The method returns the same object with the metadata slot enriched with the parameters and results of the analysis.

    MAE <- runDiffAnalysis(MAE,
      SE.name = "RNAtest", p.adj.method = "BH",
      method = "edgeRglmfit", p.adj.cutoff = 0.05, logFC.cutoff = 0
    ) |>
      runDiffAnalysis(
        SE.name = "protetest", p.adj.method = "BH",
        method = "limmalmFit", p.adj.cutoff = 0.05, logFC.cutoff = 0
      ) |>
      runDiffAnalysis(
        SE.name = "metatest", p.adj.method = "BH",
        method = "limmalmFit", p.adj.cutoff = 0.05, logFC.cutoff = 0
      )

    # access to the settings

    getDiffSettings(MAE, SE.name = "RNAtest")
    #> $method
    #> [1] "edgeRglmfit"
    #>
    #> $p.adj.method
    #> [1] "BH"
    #>
    #> $p.adj.cutoff
    #> [1] 0.05
    #>
    #> $abs.logFC.cutoff
    #> [1] 0
    #>
    #> $contrastCoef
    #>                                                   Intercept Repeatrep2
    #> (temperatureMedium - temperatureLow) in mean              0          0
    #> (temperatureElevated - temperatureLow) in mean            0          0
    #> (temperatureElevated - temperatureMedium) in mean         0          0
    #>                                                   Repeatrep3 temperatureMedium
    #> (temperatureMedium - temperatureLow) in mean               0                 1
    #> (temperatureElevated - temperatureLow) in mean             0                 0
    #> (temperatureElevated - temperatureMedium) in mean          0                -1
    #>                                                   temperatureElevated
    #> (temperatureMedium - temperatureLow) in mean                        0
    #> (temperatureElevated - temperatureLow) in mean                      1
    #> (temperatureElevated - temperatureMedium) in mean                   1
    #>                                                   imbibitionEI imbibitionLI
    #> (temperatureMedium - temperatureLow) in mean                 0            0
    #> (temperatureElevated - temperatureLow) in mean               0            0
    #> (temperatureElevated - temperatureMedium) in mean            0            0

    # Summary of the differential analysis

    getDiffStat(MAE[["RNAtest"]])
    #>                                                    All   Up Down
    #> (temperatureMedium - temperatureLow) in mean      4879 2387 2492
    #> (temperatureElevated - temperatureLow) in mean    9648 4868 4780
    #> (temperatureElevated - temperatureMedium) in mean 4141 2096 2045

    plotDiffAnalysis(MAE,
      SE.name = "RNAtest",
      contrastName = "(temperatureMedium - temperatureLow) in mean",
      typeofplots = "volcano"
    )
    #> $Volcano.plot

    plotBoxplotDE(MAE[["RNAtest"]],
      feature = "AT4G04810"
    )

#### Co-expression analysis: settings and results

Co-expression analysis on the list of differentially expressed features can be performed using the `runCoExpression` method. This method uses methods from the `coseq` package with a set of optimal parameters tailored to each omics. In this example, we will perform a co-expression analysis on the `proteomics` data.

The results can be plot using the `getCoExpAnalysesSummary` method.

A co-expression profile can be plotted for a given cluster using the `plotCoExpressionProfile` function.

    MAE <- runCoExpression(MAE,
      SE.name = "protetest",
      K = 2:5, replicates = 5,
      merge = "union"
    )
    #> ****************************************
    #> coseq analysis: Normal approach & none transformation
    #> K = 2 to 5
    #> Use seed argument in coseq for reproducible results.
    #> ****************************************
    #> ****************************************
    #> coseq analysis: Normal approach & none transformation
    #> K = 2 to 5
    #> Use seed argument in coseq for reproducible results.
    #> ****************************************
    #> ****************************************
    #> coseq analysis: Normal approach & none transformation
    #> K = 2 to 5
    #> Use seed argument in coseq for reproducible results.
    #> ****************************************
    #> ****************************************
    #> coseq analysis: Normal approach & none transformation
    #> K = 2 to 5
    #> Use seed argument in coseq for reproducible results.
    #> ****************************************
    #> ****************************************
    #> coseq analysis: Normal approach & none transformation
    #> K = 2 to 5
    #> Use seed argument in coseq for reproducible results.
    #> ****************************************

    getCoExpAnalysesSummary(MAE)

    plotCoExpression(MAE[["protetest"]])$ICL

    plotCoExpressionProfile(MAE[["protetest"]], cluster = 2)

#### Annotation enrichment analysis: settings and results

Annotation enrichment analysis can be performed using the `runAnnotationEnrichment` method. This method uses the `clusterProfiler` package. In this example, the `org.At.tair.db` database for Arabidopsis thaliana will be used to perform the GO enrichment analysis of the DE protein list.

The results can be viewed using the `getEnrichRes` method, a summary of the number of enriched terms by the `sumORA` function and plotted, by example, using the `plotEnrichComp` method.

    MAE <- runAnnotationEnrichment(MAE,
      SE.name = "protetest",
      OrgDb = "org.At.tair.db",
      keyType = "TAIR",
      pvalueCutoff = 0.05,
      from = "DiffExp",
      database = "GO",
      domain = "CC"
    )

    results <- getEnrichRes(MAE[["protetest"]],
      from = "DiffExp", database = "GO"
    )

    sumORA(MAE[["protetest"]], from = "DiffExp", database = "GO")
    #>                                                                                            Contrast
    #> (temperatureMedium - temperatureLow) in mean           (temperatureMedium - temperatureLow) in mean
    #> (temperatureElevated - temperatureLow) in mean       (temperatureElevated - temperatureLow) in mean
    #> (temperatureElevated - temperatureMedium) in mean (temperatureElevated - temperatureMedium) in mean
    #>                                                   CC
    #> (temperatureMedium - temperatureLow) in mean       0
    #> (temperatureElevated - temperatureLow) in mean     1
    #> (temperatureElevated - temperatureMedium) in mean  1

    plotEnrichComp(MAE[["protetest"]],
      from = "DiffExp", database = "GO", domain = "CC",
      matrixType = "FC"
    )

### Multi-omics integration analysis

The multi-omics step in RFLOMICS takes two steps: the preparation of the object, based on the user-selected method, and the actual run of the selected method. This is done using `prepareForIntegration` and `runOmicsIntegration`. In this example, we will use only the proteomics and metabolomics dataset with the mixOmics package (block.plsda function).

`prepareForIntegration` does not return a RflomicsMAE object, it returns the corresponding type to be an input for either MOFA2 or mixOmics functions.

    listIntegration <- prepareForIntegration(MAE,
      omicsNames = c("protetest", "metatest"),
      variableLists = rownames(MAE),
      method = "mixOmics"
    )

    MAE <- runOmicsIntegration(
      object = MAE,
      preparedObject = listIntegration,
      method = "mixOmics",
      selectedResponse = "temperature",
      ncomp = 3
    )

Visualizing results is made through the original package functions.

    mixOmics::plotIndiv(getMixOmics(MAE, response = "temperature"))

# Generating a report from the RflomicsMAE object

The `generateReport` function is used to generate a report from a RflomicsMAE object. The report is generated in HTML format.

The MAE object can be saved (export = TRUE), exporting the object in a .RData, the report in html format, the graphs in png format and the data in txt (tabulated) format.

It’s use is straightforward, using the `generateReport(object = MAE, fileName = "ecoseed_report.html", export = FALSE)` command. It can take a long time, depending on the amount of analyses performed and the data size.

# Session information

    sessionInfo()
    #> R version 4.6.0 (2026-04-24)
    #> Platform: x86_64-pc-linux-gnu
    #> Running under: Ubuntu 24.04.4 LTS
    #>
    #> Matrix products: default
    #> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
    #> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
    #>
    #> 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
    #>
    #> time zone: Etc/UTC
    #> tzcode source: system (glibc)
    #>
    #> attached base packages:
    #> [1] stats4    stats     graphics  grDevices utils     datasets  methods
    #> [8] base
    #>
    #> other attached packages:
    #>  [1] RFLOMICS_1.4.0              coseq_1.36.0
    #>  [3] knitr_1.51                  htmltools_0.5.9
    #>  [5] ggplot2_4.0.3               dplyr_1.2.1
    #>  [7] shinyBS_0.65.0              MultiAssayExperiment_1.38.0
    #>  [9] SummarizedExperiment_1.42.0 Biobase_2.72.0
    #> [11] GenomicRanges_1.64.0        Seqinfo_1.2.0
    #> [13] IRanges_2.46.0              S4Vectors_0.50.0
    #> [15] BiocGenerics_0.58.0         generics_0.1.4
    #> [17] MatrixGenerics_1.24.0       matrixStats_1.5.0
    #> [19] BiocStyle_2.40.0
    #>
    #> loaded via a namespace (and not attached):
    #>   [1] fs_2.1.0                enrichplot_1.32.0       httr_1.4.8
    #>   [4] RColorBrewer_1.1-3      doParallel_1.0.17       backports_1.5.1
    #>   [7] tools_4.6.0             R6_2.6.1                DT_0.34.0
    #>  [10] HDF5Array_1.40.0        lazyeval_0.2.3          uwot_0.2.4
    #>  [13] rhdf5filters_1.22.0     GetoptLong_1.1.1        withr_3.0.2
    #>  [16] gridExtra_2.3           bayesm_3.1-7            cli_3.6.6
    #>  [19] flashClust_1.1-4        network_1.20.0          scatterpie_0.2.6
    #>  [22] labeling_0.4.3          sass_0.4.10             mvtnorm_1.3-7
    #>  [25] S7_0.2.2                robustbase_0.99-7       proxy_0.4-29
    #>  [28] systemfonts_1.3.2       yulab.utils_0.2.4       gson_0.1.0
    #>  [31] DOSE_4.6.0              plotrix_3.8-14          limma_3.68.0
    #>  [34] org.At.tair.db_3.22.0   RSQLite_2.4.6           gridGraphics_0.5-1
    #>  [37] shape_1.4.6.1           vroom_1.7.1             car_3.1-5
    #>  [40] HTSCluster_2.0.11       GO.db_3.22.0            leaps_3.2
    #>  [43] Matrix_1.7-5            abind_1.4-8             lifecycle_1.0.5
    #>  [46] scatterplot3d_0.3-45    yaml_2.3.12             edgeR_4.10.0
    #>  [49] carData_3.0-6           rhdf5_2.56.0            qvalue_2.44.0
    #>  [52] SparseArray_1.12.0      Rtsne_0.17              grid_4.6.0
    #>  [55] blob_1.3.0              promises_1.5.0          shinydashboard_0.7.3
    #>  [58] crayon_1.5.3            dir.expiry_1.20.0       ggtangle_0.1.2
    #>  [61] lattice_0.22-9          cowplot_1.2.0           KEGGREST_1.52.0
    #>  [64] HTSFilter_1.52.0        capushe_1.1.3           sys_3.4.3
    #>  [67] sna_2.8                 maketools_1.3.2         pillar_1.11.1
    #>  [70] ComplexHeatmap_2.28.0   rjson_0.2.23            estimability_1.5.1
    #>  [73] corpcor_1.6.10          mixOmics_6.36.0         codetools_0.2-20
    #>  [76] glue_1.8.1              ggiraph_0.9.6           ggfun_0.2.0
    #>  [79] fontLiberation_0.1.0    data.table_1.18.2.1     vctrs_0.7.3
    #>  [82] png_0.1-9               treeio_1.36.0           gtable_0.3.6
    #>  [85] cachem_1.1.0            xfun_0.57               S4Arrays_1.12.0
    #>  [88] mime_0.13               coda_0.19-4.1           aisdk_1.1.0
    #>  [91] pheatmap_1.0.13         iterators_1.0.14        statmod_1.5.1
    #>  [94] nlme_3.1-169            ggtree_4.2.0            bit64_4.8.0
    #>  [97] fontquiver_0.2.1        filelock_1.0.3          UpSetR_1.4.0
    #> [100] tensorA_0.36.2.1        bslib_0.10.0            otel_0.2.0
    #> [103] colorspace_2.1-2        DBI_1.3.0               DESeq2_1.52.0
    #> [106] tidyselect_1.2.1        processx_3.9.0          emmeans_2.0.3
    #> [109] bit_4.6.0               compiler_4.6.0          Rmixmod_2.1.10
    #> [112] compositions_2.0-9      httr2_1.2.2             h5mread_1.4.0
    #> [115] plotly_4.12.0           fontBitstreamVera_0.1.1 DelayedArray_0.38.1
    #> [118] scales_1.4.0            DEoptimR_1.1-4          callr_3.7.6
    #> [121] multcompView_0.1-11     rappdirs_0.3.4          stringr_1.6.0
    #> [124] digest_0.6.39           MOFA2_1.22.0            rmarkdown_2.31
    #> [127] basilisk_1.24.0         XVector_0.52.0          pkgconfig_2.0.3
    #> [130] FactoMineR_2.14         fastmap_1.2.0           rlang_1.2.0
    #> [133] GlobalOptions_0.1.4     htmlwidgets_1.6.4       shiny_1.13.0
    #> [136] farver_2.1.2            jquerylib_0.1.4         jsonlite_2.0.0
    #> [139] BiocParallel_1.46.0     statnet.common_4.13.0   GOSemSim_2.38.0
    #> [142] magrittr_2.0.5          Formula_1.2-5           ggnetwork_0.5.14
    #> [145] ggplotify_0.1.3         patchwork_1.3.2         Rhdf5lib_2.0.0
    #> [148] Rcpp_1.1.1-1.1          ape_5.8-1               ggnewscale_0.5.2
    #> [151] gdtools_0.5.0           reticulate_1.46.0       stringi_1.8.7
    #> [154] MASS_7.3-65             plyr_1.8.9              parallel_4.6.0
    #> [157] ggrepel_0.9.8           forcats_1.0.1           Biostrings_2.80.0
    #> [160] splines_4.6.0           circlize_0.4.18         locfit_1.5-9.12
    #> [163] ps_1.9.3                ggpubr_0.6.3            igraph_2.3.0
    #> [166] ggsignif_0.6.4          enrichit_0.1.4          buildtools_1.0.0
    #> [169] reshape2_1.4.5          evaluate_1.0.5          BiocManager_1.30.27
    #> [172] tzdb_0.5.0              foreach_1.5.2           tweenr_2.0.3
    #> [175] httpuv_1.6.17           tidyr_1.3.2             purrr_1.2.2
    #> [178] polyclip_1.10-7         clue_0.3-68             BiocBaseUtils_1.14.0
    #> [181] ggforce_0.5.0           broom_1.0.12            xtable_1.8-8
    #> [184] RSpectra_0.16-2         e1071_1.7-17            tidytree_0.4.7
    #> [187] rstatix_0.7.3           tidydr_0.0.6            later_1.4.8
    #> [190] viridisLite_0.4.3       class_7.3-23            rARPACK_0.11-0
    #> [193] tibble_3.3.1            clusterProfiler_4.20.0  aplot_0.2.9
    #> [196] ellipse_0.5.0           memoise_2.0.1           AnnotationDbi_1.74.0
    #> [199] cluster_2.1.8.2         corrplot_0.95           shinyWidgets_0.9.1