# GSEAlens：基因集富集分析的交互式探索平台

# 包简介

GSEAlens 的名称源自 Lens（透镜），象征本包像 放大镜 一样，帮助研究者深入

探索 GSEA 富集分析中的关键通路。 GSEAlens 提供一个基于 Web 的交互式平台，用于展示通路简介与描述，并集成 AI 辅助的 通路富集结果导出功能。通过封装工作流并标准化输入格式，本 R 包简化了 GSEA 富集分析 结果的查看与探索过程。

## 与 Bioconductor 工作流的整合

GSEAlens 作为 DEG 后探索层（post-DEG exploration layer），被设计为可插入标准 Bioconductor RNA-seq 与功能富集工作流：

- 上游（输入准备）：GSEAlens 接收来自 limma 的已拟合模型对象 （`limma::eBayes()` 返回的 `MArrayLM` 对象，基于 edgeR + limma-voom 流程），或来自 DESeq2 的 `DESeqDataSet` 对象。表达矩阵与样本元数据 可作为 SummarizedExperiment 对象传入，确保与 Bioconductor 核心数据 容器的互操作性。

- 富集计算：在底层，GSEAlens 包装了 clusterProfiler（`GSEA()` 函数）， 并使用来自 msigdbr 的基因集集合。因此统计框架通过 `clusterProfiler` 继承了 fgsea 的方法论。

- 并行化：GSEAlens 使用 future（`future::multisession`）执行多对比 并行计算。在并行运行前，用户的原始 `future::plan()` 与 `future.globals.maxSize` 选项会被保存，并在函数退出时通过 `on.exit()` 恢复，因此全局状态不会被污染。在 开发阶段，我们经验性地观察到，对于本包的典型工作负载（需序列化较大的全局对象： 完整 DE 表 + 基因集字典 + 元数据字典），`future::multisession` 在 Windows 平台上 比 BiocParallel（`SnowParam` / PSOCK 序列化）速度更有体感优势。 这只是开发过程中的一次非正式观察，并非严格的基准测试；如果 `BiocParallel` 更适合 您的运行环境，用户完全可以自行切换到 `BiocParallel` 重新运行分析。

- 可视化：绘图构建于 enrichplot、ComplexHeatmap、 ggplot2、patchwork、visNetwork 之上， 产出的图形与下游发表流程兼容。

- 下游：Shiny 应用中的”生成 R 代码”功能会输出自包含脚本，可嵌入 rmarkdown / Quarto 报告或集成到多步骤流水线。 典型的端到端 Bioconductor 工作流因此为：

    RNA-seq counts

       |
       +--[edgeR + limma-voom]--> MArrayLM fit --+
       |                                         |
       +--[DESeq2]--------------> DESeqDataSet --+
                                                 |
                                                 v
                                       [setup_gsea_env]
                                                 |
                                                 v
                                      [batch_calc_gsea]
                                                 |
                                                 v
                                        Shiny 应用探索
                                                 |
                                                 v
                                      可复现 R 代码导出

这使得 GSEAlens 自然地补充了现有 Bioconductor 富集分析包：当 clusterProfiler、 GSVA、gprofiler2 或 ReactomePA 关注于

计算富集时，GSEAlens 关注于对结果通路列表的交互式解读。

## 安装

GSEAlens 可从 Bioconductor 安装。使用以下命令安装稳定版本：

    if (!requireNamespace("BiocManager", quietly = TRUE))
        install.packages("BiocManager")
    BiocManager::install("GSEAlens")

开发版本可从 GitHub 安装：

    if (!requireNamespace("pak", quietly = TRUE))
        install.packages("pak")
    pak::pkg_install("DDL095/GSEAlens")

# 快速开始

本节使用 airway 数据集演示 GSEAlens 的完整工作流。由于 GSEAlens

本身不做 DEG 分析，我们假定输入对象（`fit`、`dds_se`、`dds`）已按照标准 limma / DESeq2 流程准备完毕。

详细的输入准备步骤（limma-voom 拟合、DESeq2 对象构造、基因过滤）请参阅 补充 vignette `vignette("GSEAlens-preprocessing-zh")`。

    library(GSEAlens)
    library(airway)

在本主 vignette 中，三个输入对象（`fit`、`dds_se`、`dds`）按照预处理 vignette 的 步骤准备完毕。由于在每次编译时重跑 `DESeq2::DESeq()` 与 limma-voom 流程会使 vignette 变慢，我们在 `inst/extdata/` 中附带了这些对象的预计算版本； 重新生成它们的脚本位于 `inst/scripts/make_preprocessed_inputs.R`， 完全遵循预处理 vignette 的步骤。

关于附带的 `dds_se` 的说明：为满足 Bioconductor `extdata` 文件不超过 5 MB 的要求， 本 vignette 使用的 `preprocessed_dds_se.rds` 是经由 `make_preprocessed_inputs.R` 中的 `slim_dds_se()` 函数裁剪过的 `DESeqDataSet`。裁剪操作去除了 `mu` / `H` / `cooks` 这三个 assay（`DESeq()` 拟合的中间产物），并将 `rowRanges` 由 `GRangesList` 展平为 `GRanges`（每个基因 仅保留一条代表性区间）。经 `DESeq2::results()` 与全部 GSEAlens 入口函数验证， 裁剪前后的 `log2FoldChange` / `pvalue` / `padj` 完全一致。如需重建未裁剪的完整 `DESeqDataSet`（用于 DESeq2 教学），请参阅预处理 vignette。

    data(preprocessed_limma, package = "GSEAlens")
    preproc_limma         <- preprocessed_limma
    fit                   <- preproc_limma$fit
    gsea_limma_voom_data  <- preproc_limma$gsea_limma_voom_data
    data(preprocessed_dds_se, package = "GSEAlens")
    dds_se <- preprocessed_dds_se
    data(preprocessed_dds, package = "GSEAlens")
    dds <- preprocessed_dds

若要从自己的数据中准备这些对象，请参阅补充预处理 vignette：

    vignette("GSEAlens-preprocessing-zh")

## GSEAlens处理

### 创建GSEA基因集对象

使用`build_gsea_pathways`函数构建用于GSEA富集分析的基因集对象

    # 实际调用（在 Bioconductor 构建机上较慢，因需加载多个 MSigDB 集合；编译时跳过）
    # gsea_pathwaysets <- build_gsea_pathways(
    #   species = "HS", auto_select = c("H", "C2:CP:REACTOME", "C5:GO:BP")
    # )

    # 为加速 vignette 编译，此处加载预计算的轻量级基因集对象
    # （Hallmark + KEGG_LEGACY，共 236 条通路）。
    # 重新生成方法见 inst/scripts/make_gsea_pathwaysets_toy.R。
    data(gsea_pathwaysets_toy, package = "GSEAlens")
    gsea_pathwaysets <- gsea_pathwaysets_toy

### 组装运算对象

通过`setup_gsea_env`函数，组装用于计算分析的`GSEAEnv`对象，不同的终端使用同一个函数，仅纳入数据不同，对于limma-voom流程，由于`fit`对象当中不包含原始的基因读数，因此必须额外纳入过滤后用于生成`fit`对象的`DGEList`，本例中为多步过滤的`gsea_limma_voom_data`。 limma-voom 流程对象纳入分析。

    gseadata_limmavoom <- setup_gsea_env(fit = fit,pathway_obj = gsea_pathwaysets,expr_data = gsea_limma_voom_data)

DESeq2 的 SummarizedExperiment 对象纳入分析。

    gseadata_se <- setup_gsea_env(fit = dds_se,pathway_obj = gsea_pathwaysets)

DESeq2 的 Count matrix 流程的对象纳入分析。

    gseadata_dds <- setup_gsea_env(fit = dds,pathway_obj = gsea_pathwaysets)

### 运行处理

所有对象均使用`batch_calc_gsea`这个函数处理，没有任何区别。 并行计算提示：可根据电脑性能调整 workers 选项，设置计算使用的核心数量。 比对数量越多，建议设置越高的核心数以提升计算效率。

    # 将 vignette 输出写入临时目录，避免污染 Bioconductor 构建机器的工作目录。
    out_dir <- tempdir()
    # limma-voom 流程
    gsea_res_limmavoom <- batch_calc_gsea(gseadata_limmavoom,
                                                     custom_series_name = "limmavoom_data",
                                                     output_dir = out_dir,
                                                     workers = 2,  # 根据比对数量和电脑性能调整
                                                     force = TRUE)
    # DESeq2 SummarizedExperiment 流程
    gsea_res_se <- batch_calc_gsea(gseadata_se,
                                              custom_series_name = "dds_se_data",
                                              output_dir = out_dir,
                                              workers = 2,
                                              force = TRUE)
    # DESeq2 Count matrix 流程
    gsea_res_dds <- batch_calc_gsea(gseadata_dds,
                                               custom_series_name = "dds_data",
                                               output_dir = out_dir,
                                               workers = 2,
                                               force = TRUE)

### 交互式分析与查看

`batch_calc_gsea` 运行后，会在输出目录生成一个 RDS 文件（“GSEA Capsule”）。可以 直接用 `readRDS` 读取，或使用 `import_gsea_capsule`，后者会自动将相关文件整理到 您的 `.Rmd` / `.R` 脚本所在目录，并执行数据体检。

    gsea_res <- import_gsea_capsule("/path/to/your/files/")
    # 或者直接读取 RDS 文件：
    # gsea_res <- readRDS("/path/of/your/file/")

## 使用 Shiny 应用进行交互式探索

GSEAlens 提供了一个交互式 Shiny 应用，用于 GSEA 结果的可视化探索。将 `batch_calc_gsea` 返回的 `GseaRes` 对象（或通过 `import_gsea_capsule` 加载的对象） 传入 `launch_gsea_app` 即可启动。

### 启动应用

    launch_gsea_app(gsea_res)

可选：传入 `addition_data` 数据框（或 `.csv` / `.rds` 文件路径），将通路注释合并到 主表。若为 `NULL`，应用会自动检测工作目录下的 `addition_data_gsealens.rds` 或 `addition_data_gsealens.csv`。

    launch_gsea_app(gsea_res, addition_data = "pathway_annotations.csv")

### 应用布局

应用采用 侧边栏 + 主面板 布局，主面板包含 6 个 tab。侧边栏（数据预处理 模块）提供全局控件；主面板承载六个功能 tab。

#### 侧边栏 – 数据预处理

提供跨 tab 可见的全局控件：

- 对比选择：选择要探索的两两比较

- 基因集子组过滤：按集合（如 H、C2、C5）子集化通路

- DEG marker 选择：高亮关注的基因

- 组显示顺序：自定义因子排序

- 表达指标：切换 CPM / logCPM / VST / FPKM

源文件：`R/08_shiny_mod_data_prep.R`

#### Tab 1 – 主工作区（Main Workspace）

默认起始 tab，整合两个子模块：

- 主表（`DT::datatable`）：所有富集通路的交互式表格，支持列排序（NES、pvalue、 p.adjust、setSize）与 checkbox 选择。选中的行会推送到其他 tab。

- 组合通路绘图：将多个选中通路聚合为单张组合图（底层使用 `patchwork`）。 导出模态框包含 WYSIWYG 实时预览、PDF/PNG/SVG/TIFF 输出，以及”复制 R 代码” 按钮（通过 `generate_combined_plot_code()` 生成自包含脚本）。 点击任意通路行会打开通路详情 Modal，展示完整描述、leading-edge 基因，并提供 “加入绘图队列”选项。 源文件：`R/09_shiny_mod_table.R`、`R/11_shiny_mod_modal.R`、`R/12_shiny_mod_multi_plot.R`

#### Tab 2 – 全息四象限联动（Holographic Quadruple Linkage）

四个同步面板：

1. 左上：通路选择器（与主工作区联动）

2. 右上：基因排名表（按 `|stat|` 排序）

3. 左下：所选对比的 volcano 图

4. 右下：所选基因的表达 boxplot

选择双向同步——在表中点击基因会在 volcano 中高亮；在 volcano 中点击点会滚动 表格到对应行。 源文件：`R/10_shiny_mod_quadrant.R`

#### Tab 3 – 通路关系探索（Pathway Relationship Exploration）

通路间关系的网络可视化，节点为通路，边表示共享基因（Jaccard 相似度）。两种选择 模式：

- 单选模式：探索一个通路及其邻居

- 批量模式：从主工作区选中多个通路，可视化它们的相互连接

本 Tab 提供两个子面板：

- DotPlot 面板：横向点图。横轴为 NES，点颜色编码显著性 （`-log10(FDR)` / `-log10(P-value)` / `|NES|`，用户可选），点尺寸编码 基因集量级。尺寸映射采用数据驱动（无固定域、无变换），使点尺寸 忠实反映底层基因集量级范围。这与 `enrichplot::dotplot` 使用的 `ggplot2::scale_size_continuous(range=c(3,8))` 范式一致——尺寸 上下限由数据本身决定，而非人为施加固定域。

- Network 面板：图布局（Fruchterman-Reingold / Kamada-Kawai / 圆形）， 提供两种用户可选的边粗细编码：

  - Weight-based（默认，`emapplot` 范式）：边粗细与 Jaccard 值线性正比， 视觉忠实反映相似度量级。推荐用于发表。

  - Rank-based：边粗细按 Jaccard 排名分配，保证所有边在视觉上等距分布， 不受绝对权重影响。适合权重方差很小的密集网络。 节点大小反映 `|NES|`；节点颜色反映富集方向（红色 = 左组上调，蓝色 = 右组 上调）。

导出中心（两个面板均有）：点击 “Export Publication Plot” 弹出 modal，

含宽度 / 高度 / DPI / 格式（PDF、PNG、SVG、TIFF）控件，以及两个动作：通过 `ggsave` 下载静态 `ggplot2` 渲染图像（不依赖 kaleido/orca 等外部工具）， 或复制完整可复现 R 脚本（`generate_dotplot_code()` / `generate_network_code()`） 到剪贴板。静态图与复制的代码运行结果字节一致。 源文件：`R/13_shiny_mod_pathway_relation.R`、辅助函数 `R/utils_hubgene.R`， 代码生成器见 `R/15_code_generator.R`。

#### Tab 4 – HubGene 网络（HubGene Network）

识别并可视化 HubGene（在多个富集通路中高度连接的基因），使用 `visNetwork` 交互式 图。可调参数：

- 物理模拟：开关，调整力导向参数

- 通路节点尺寸编码：三种用户可选模式

  - 按基因集大小（`setSize`，默认）：与 `enrichplot::cnetplot` 范式一致； 通路节点大小与基因集基因数（sqrt 缩放）成正比。推荐用于生物学解读。

  - 按显著性（`-log10(FDR)`）：突出最值得信任的通路。

  - 固定大小：滑块控制的常量大小（旧行为）。 滑块值始终作为基准尺寸，所选编码在其 `[0.6×, 1.4×]` 区间缩放，以保证 visNetwork 力导向布局稳定（尺寸差异超过 ~2.3 倍会导致布局抖动）。 基因节点尺寸不受影响（始终为 `base + degree * 3`）。

- 网络统计：节点数、边数、密度的汇总面板

导出中心：与 Tab 3 相同的 modal 模式。静态复现使用

`generate_hubgene_code()`，通过 `igraph` + `ggplot2`（无 `ggraph` 依赖）将 通路节点绘制为菱形、基因节点绘制为圆形的二分图。当前尺寸编码模式会保留到生成 的脚本中。 源文件：`R/16_shiny_mod_hubgene_vis.R`，代码生成器见 `R/15_code_generator.R`。

#### Tab 5 – AI 解读（AI Interpretation）

为外部 LLM（如 GPT-4、Claude）生成结构化 prompt，用于解读选中通路。支持自定义 模板，用户可强制要求特定输出格式（如”生成一段引用 leading-edge 基因的三段式生物学 解读”）。生成的 prompt 可一键复制到剪贴板。 源文件：`R/17_shiny_mod_AI.R`

注意：本 tab 仅生成 prompt，不直接调用外部 API。作者刻意如此设计，以便用户 自行管控 API key 与网络调用。

#### Tab 6 – 联合 GSEA 画布（Joint GSEA Canvas）

将多个选中通路的富集 running-score 曲线聚合为单张画布。图像导出模态框 包含 WYSIWYG 实时预览、PDF/PNG/SVG/TIFF 输出、可调画布边距，以及”复制 R 代码”按钮（通过 `generate_joint_canvas_code()` 生成自包含 R 脚本，可在 Shiny 环境外重现该图）。 源文件：`R/14_shiny_mod_joint_canvas.R`，代码生成器 `R/15_code_generator.R`

### 输出解读指南

可视化 | 关注要点 | 生物学含义
--- | --- | ---
NES（标准化富集得分） | 符号与幅度 | 正 NES -> 该通路在对比右组中上调
p.adjust | < 0.05 阈值 | BH 校正后的统计显著性
Volcano（Tab 2） | 对称 / 不对称 | 对称表明全局性变化；不对称表明靶向调控
通路网络（Tab 3） | 簇结构 | 紧密连接的簇提示共调控的生物学模块
HubGene（Tab 4） | 高度数基因 | Hub 基因是潜在的生物标志物或调控节点
联合画布（Tab 6） | 曲线重叠 | 重叠的 running-score 曲线提示协同调控

### 可重现代码导出

Tab 1（组合通路绘图）、2、3、4、6 均在各自的图像导出模态框中集成了

“复制 R 代码” 按钮，会生成一份独立 R 脚本重现当前可视化。

这是生成发表级图表的推荐方式：在 Shiny 应用中迭代调整图像，然后导出代码用于最终 定制。

# R包中间对象说明

## GseaEnv 对象

`setup_gsea_env` 函数返回的 `GseaEnv` 对象包含以下组件： | 组件 | 说明 | |——|——| | `backend_info` | 后端类型信息（limma-voom 或 DESeq2） | | `contrast_registry` | 对比组注册表，包含所有成对比较信息 | | `de_store` | 差异分析结果存储 | | `expr_bundle` | 表达数据封装（原始计数、标准化矩阵、样本元数据） | | `geneset` | 基因集信息（TERM2GENE、元数据字典、物种） |

## GseaRes 对象

`batch_calc_gsea` 函数返回的 `GseaRes` 对象包含以下组件： | 组件 | 说明 | |——|——| | `metadata` | 计算元数据（运行时间、使用的核心数、参数设置） | | `backend_info` | 后端类型信息 | | `contrast_registry` | 对比组注册表 | | `de_store` | 差异分析结果存储 | | `expr_bundle` | 表达数据封装 | | `geneset_info` | 基因集信息 | | `results` | GSEA 结果列表，每个对比组对应一个条目 |

## GseaTask 对象

`extract_gsea_task` 函数返回的 `GseaTask` 对象用于单对比分析：

组件 | 说明
--- | ---
`gsea_res` | GSEA result 对象
`meta` | 元信息（对比组信息、基因集名称、表达数据）

# Session info

    sessionInfo()

    ## R version 4.6.1 (2026-06-24)
    ## Platform: x86_64-pc-linux-gnu
    ## Running under: Ubuntu 26.04 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.32.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] GSEAlens_0.99.35            DESeq2_1.53.2
    ##  [3] edgeR_4.11.6                limma_3.69.4
    ##  [5] airway_1.33.2               SummarizedExperiment_1.43.0
    ##  [7] Biobase_2.73.2              GenomicRanges_1.65.1
    ##  [9] Seqinfo_1.3.0               IRanges_2.47.2
    ## [11] S4Vectors_0.51.6            BiocGenerics_0.59.12
    ## [13] generics_0.1.4              MatrixGenerics_1.25.0
    ## [15] matrixStats_1.5.0           BiocStyle_2.41.0
    ##
    ## loaded via a namespace (and not attached):
    ##   [1] later_1.4.8             splines_4.6.1           ggplotify_0.1.3
    ##   [4] tibble_3.3.1            polyclip_1.10-7         enrichit_0.2.1
    ##   [7] lifecycle_1.0.5         httr2_1.3.0             doParallel_1.0.17
    ##  [10] globals_0.19.1          processx_3.9.0          lattice_0.23-1
    ##  [13] MASS_7.3-66             magrittr_2.0.5          plotly_4.12.1
    ##  [16] sass_0.4.10             rmarkdown_2.31          jquerylib_0.1.4
    ##  [19] yaml_2.3.12             httpuv_1.6.17           otel_0.2.0
    ##  [22] ggtangle_0.1.2          DBI_1.3.0               buildtools_1.0.0
    ##  [25] RColorBrewer_1.1-3      abind_1.4-8             purrr_1.2.2
    ##  [28] msigdbr_26.1.0          yulab.utils_0.2.4       tweenr_2.0.3
    ##  [31] rappdirs_0.3.4          aisdk_1.4.12            gdtools_0.5.1
    ##  [34] circlize_0.4.18         enrichplot_1.33.0       ggrepel_0.9.8
    ##  [37] listenv_1.0.0           tidytree_0.4.8          maketools_1.3.2
    ##  [40] parallelly_1.48.0       codetools_0.2-20        DelayedArray_0.39.5
    ##  [43] DOSE_4.7.2              DT_0.34.0               ggforce_0.5.0
    ##  [46] tidyselect_1.2.1        shape_1.4.6.1           aplot_0.3.1
    ##  [49] farver_2.1.2            jsonlite_2.0.0          GetoptLong_1.1.1
    ##  [52] progressr_1.0.0         iterators_1.0.14        systemfonts_1.3.2
    ##  [55] foreach_1.5.2           tools_4.6.1             ggnewscale_0.5.2
    ##  [58] treeio_1.37.0           Rcpp_1.1.2              glue_1.8.1
    ##  [61] SparseArray_1.13.2      BiocBaseUtils_1.15.1    xfun_0.60
    ##  [64] qvalue_2.45.0           dplyr_1.2.1             withr_3.0.3
    ##  [67] BiocManager_1.30.27     fastmap_1.2.0           shinyjs_2.1.1
    ##  [70] callr_3.8.0             digest_0.6.39           mime_0.13
    ##  [73] R6_2.6.1                gridGraphics_0.5-1      colorspace_2.1-3
    ##  [76] GO.db_3.23.1            RSQLite_3.53.3          tidyr_1.3.2
    ##  [79] fontLiberation_0.1.0    data.table_1.18.4       httr_1.4.8
    ##  [82] htmlwidgets_1.6.4       S4Arrays_1.13.0         scatterpie_0.2.6
    ##  [85] pkgconfig_2.0.3         gtable_0.3.6            blob_1.3.0
    ##  [88] ComplexHeatmap_2.29.0   S7_0.2.2                XVector_0.53.0
    ##  [91] sys_3.4.3               clusterProfiler_4.21.1  htmltools_0.5.9
    ##  [94] fontBitstreamVera_0.1.1 clue_0.3-68             scales_1.4.0
    ##  [97] png_0.1-9               ggfun_0.2.1             knitr_1.51
    ## [100] reshape2_1.4.5          rjson_0.2.23            visNetwork_2.1.4
    ## [103] nlme_3.1-170            curl_7.1.0              cachem_1.1.0
    ## [106] GlobalOptions_0.1.4     stringr_1.6.0           shinycssloaders_1.1.0
    ## [109] parallel_4.6.1          AnnotationDbi_1.75.2    pillar_1.11.1
    ## [112] grid_4.6.1              vctrs_0.7.3             promises_1.5.0
    ## [115] tidydr_0.0.6            xtable_1.8-8            cluster_2.1.8.3
    ## [118] evaluate_1.0.5          cli_3.6.6               locfit_1.5-9.12
    ## [121] compiler_4.6.1          rlang_1.3.0             crayon_1.5.3
    ## [124] future.apply_1.20.2     ps_1.9.3                plyr_1.8.9
    ## [127] fs_2.1.0                ggiraph_0.9.6           stringi_1.8.9
    ## [130] viridisLite_0.4.3       BiocParallel_1.47.0     assertthat_0.2.1
    ## [133] babelgene_22.9          Biostrings_2.81.6       lazyeval_0.2.3
    ## [136] GOSemSim_2.39.2         fontquiver_0.2.1        Matrix_1.7-6
    ## [139] patchwork_1.3.2         bit64_4.8.2             future_1.75.0
    ## [142] ggplot2_4.0.3           KEGGREST_1.53.6         statmod_1.5.2
    ## [145] shiny_1.14.0            clipr_0.8.1             igraph_2.3.3
    ## [148] memoise_2.0.1           bslib_0.12.0            ggtree_4.3.0
    ## [151] bit_4.6.0               ape_5.8-1               gson_0.2.1

# References