Skip to content

PERCEPTIONx v0.4.0 - #3

Merged
SunPast merged 5 commits into
WangLabCSU:mainfrom
Exceret:main
Nov 5, 2026
Merged

SunPast merged 5 commits into
WangLabCSU:mainfrom
Exceret:main

Conversation

@Exceret

@Exceret Exceret commented Nov 5, 2026

Copy link
Copy Markdown
Contributor

规模:78 个文件,+10521 / −5767 行

任务清单见#2


1. 版本与依赖调整(DESCRIPTION、NAMESPACE)

项目 变更
Version 0.3.0 → 0.4.0
Authors@R 从裸 person() 改为 c(...),新增 Yuxi Yang(ctb, ORCID 0009-0006-1329-1224)
Imports 新增 cli、lifecycle、data.table
Imports 移除 glmnet、randomForest(→ Suggests)
Suggests 新增 spelling、WGCNA、matrixStats、kableExtra(另收纳 glmnet/randomForest)
其他 Language: en-US、Config/roxygen2/version: 8.1.0,移除 RoxygenNote
NAMESPACE 删除约 70 行 importFrom(ggplot2/stats/...),改为全限定调用;仅保留 importFrom(data.table, %chin% , := , .N , .SD) + importFrom(rlang, .data)

净效果:依赖收敛为「核心 4 个」,其余改为可选依赖 + 运行时检查。


2. 内部实现迁移到 data.table

涉及 R/annotate.R、R/load.R、R/predict.R、R/train.R:

  • prepare_data() / annotate_clones() 的 patient_mapping、cell_clone_map 改由 data.table::data.table() 构建
  • counts <- map_dt[, list(n_cells = .N), by = list(patient, clone_key)] + dcast + setnames + setcolorder 取代循环/sapply
  • 使用 :=、%chin%、fifelse()、.SD 等语法;clone_viability_matrix、clone_counts、abundance 统一 as.data.table() 归一化
  • 刻意保留 API 返回 data.frame(如 build_clone_counts 仍返回 data.frame,因 predict_patients() 使用 clone_counts[i, cols] 的 data.frame 语义)
  • count_row_NAs() 由 apply(df, 1, ...) 改为 rowSums(is.na(df))(性能优化)

3. CLI 提示与现代化报错(最大类改动,约 150+ 处)

  • 全部 stop(...) → cli::cli_abort(c(x = ..., i = ...)),带可操作的修复建议(如"重新安装包")
  • 进度反馈统一为 cli::cli_progress_step() / cli_progress_done()、cli::cli_alert_info/success/warning、cli_h2() / cli_ul()
    • prepare_data():重写为 [1/5] 聚类 → [2/5] 患者映射 → [3/5] 克隆级均值 → [4/5] 秩归一化 → [5/5] 丰度表 五步式输出 + "Preparation complete" 汇总
    • train_models():{i}/{length(drug_list)} Processing: {drug},并给出 "Skipping X - feature ranking failed / drug not found / all model builds failed" 的分级告警
  • run_perception_app():stop() → rlang::check_installed(),缺失依赖一次性列出
  • run_seurat_pipeline():标记 lifecycle::deprecate_soft("0.3.1", ...)

4. 可选依赖的运行时降级(新增健壮性)

包 位置 降级行为
WGCNA R/utils_cortest.R:86、R/train.R:256 WGCNA::cor(..., use="pairwise.complete.obs", nThreads=) 否则回退 stats::cor
matrixStats R/predict.R:616-631 rowMins/rowMaxs/rowMedians 否则回退 apply(...)
kableExtra R/train.R:852 kable() 否则 print()
Seurat R/annotate.R rlang::check_installed("Seurat", "for clone annotation.")

5. 下载与镜像逻辑增强(R/load.R)

download_with_mirrors() 由位置参数签名改为多行具名签名,新增:

  • retries 重试循环 + timeout_seconds(模型 30s、DepMap 300s)
  • curl 超时附加参数、不完整下载检测(比对 expected_size,按百分比提示后重试)
  • 低速镜像检测(speed_threshold,KB/s 提示"考虑换镜像")
  • add_mirrors() 增加 "last" 追加模式与"全部镜像已存在"短路提示

6. 绘图(R/plot.R)

  • theme_perception() 重做:显式白色 panel/plot/legend 背景、panel.grid.minor = element_blank()、轴/标题/图例继承字号(rel(0.85) 等)、plot.margin、图例 key 尺寸
  • 所有 ggplot2:: 函数改为全限定调用(配合 NAMESPACE 精简)
  • 部分函数补充 cli::cli_abort() / cli::cli_alert_info() 输入校验与提示

7. 新增导出对象(数据目录)

三个药物清单从"内部常量"转为带文档的导出对象(R/drugs.R):

对象 说明
perception_depmap_drugs 内置 DepMap/PRISM secondary screen 药物全集
perception_fda_approved_drugs FDA 已批准子集
perception_all_drugs 44 个预训练模型覆盖的药物

配套:新增 man/perception_*_drugs.Rd,_pkgdown.yml reference 索引加入三者。
注意:R/drugs.R 的 −2009/+... 里大部分是向量排版变化——改为 # fmt:table + 四列对齐(air 的表格格式),字符串内容本身未变。


8. 包启动信息(新文件 R/PERCEPTIONx-package.R)

  • "_PACKAGE" 包级 roxygen 文档(含 License / 链接)
  • .onLoad():cli::cli_progress_step("Loading {pkg} v{version}"),.onAttach() 收尾
  • startup_message_allowed():用 packageStartupMessage 探针 + withRestarts(muffleMessage=) 判断是否允许输出启动信息(避免在 suppressMessages() 场景打扰)

9. 工程化与文档

变更 内容
air.toml(新增) R 代码格式化器配置 → 这是本分支 diff 体量的主因:R/plot.R、inst/shiny/**、dev/**、tools/** 大量改动仅为换行/缩进,无功能变化
jarl.toml(新增) linter 配置:extend-select = ["TESTTHAT"]、exclude = ["R/vendor-*.R"]、check-roxygen = true
README.Rmd(新增,+210) README 改为 Rmd 源文件生成,README.md 为产物(.Rbuildignore 已排除 ^README\.Rmd$);README.md 表格与段落被格式化重整
tests/spelling.R + inst/WORDLIST(+100) 引入拼写检查
.Rbuildignore 新增忽略 air.toml、jarl.toml、.vscode、*.qs2、README.Rmd、test_pipeline_output、test_pipeline_v2_output
.gitignore 新增 *.qs2、pipeline 输出目录
.github/(新增) workflows/feishu.yaml(飞书 webhook 通知,监听 main/devel 的 PR/push 等 30+ 事件)、CODE_OF_CONDUCT.md、CONTRIBUTING.md、SUPPORT.md、ISSUE_TEMPLATE/issue_template.md、.github/.gitignore
man/*.Rd 由 roxygen 8.1.0 重新生成:@param 描述放宽为 "Matrix, data.frame, or data.table",新增 3 个数据集 Rd + 包级 Rd

10. dev/ 与 tools/ 脚本

仅格式化重排为主;dev/bench_girafe.R、dev/time_demo.R、tools/test_pipeline*.R 有参数/流程微调(benchmark 与 e2e 脚本适配新签名)。


兼容性提示

  1. 对外函数签名基本未变(仅内部实参与文档调整),但 download_with_mirrors()(内部函数)签名已重构,若有下游调用需同步。
  2. glmnet / randomForest 已从 Imports 移到 Suggests——用户若未安装,train_models(model_type="glmnet") 会通过 caret 间接失败;发布说明中建议提示安装。
  3. 因引入 data.table 语法,NAMESPACE 的 importFrom(data.table, ...) 必须保留,否则 cedta() 判定失败会导致 [.data.table 退化为 [.data.frame 并报 object '.N' not found。
  4. 约 4000+ 行 diff 属 air 批量格式化产生的纯空白变更,代码评审时可优先用 git diff -w 过滤。

Exceret and others added 5 commits November 4, 2026 07:38
- adopt cli/lifecycle tooling
- import cli as messager
- convert internal data manipulation in annotate/prepare_data to data.table
- move glmnet/randomForest to Suggests, add data.table to Imports
- export perception_depmap_drugs/perception_fda_approved_drugs
- add Yuxi Yang as contributor in DESCRIPTION
- ignore *.qs2 and README.Rmd build artifacts
- train_models() defaults to model_type = 'glmnet', and caret's glmnet model declares glmnet/Matrix at runtime. Moving them to Suggests makes the default path fail for users without those packages.

- as.data.table() does not copy: the comment above the assignment promises a copy the code never made. Add an explicit copy() (also covers data.table < 1.15).
@SunPast
SunPast merged commit facfb51 into WangLabCSU:main Nov 5, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants