缘由
生信之路,道阻且长。记录一点避坑经验,愿能渡有缘人。
碎碎念
“及时当勉励,岁月不饶人。” ——陶渊明
告别繁琐嵌套:像 Python 一样遍历
【场景】
当你需要测试 2 种算法(cmb)、2 种模式(mode)、2 种参数(option)的所有组合时,你还在写三层嵌套的 for 循环吗?
【Python 的直观写法】
Python 开发者习惯用 itertools.product 生成笛卡尔积,代码横向展开,非常直观:
import itertools
combinations = itertools.product(["cmb1", "cmb2"], ["mode1", "mode2"], ["opt1", "opt2"])
for cmb, mode, option in combinations:
print(f"✅ Running: {cmb} | {mode} | {option}")
main(dir_sets, cmb, option, mode)
R 版:expand.grid + pmap
【R 进阶方案】
在 R 中,我们可以利用 expand.grid 完美复刻全组合逻辑,再通过 purrr::pmap 实现类似 Python 的优雅遍历。
我们甚至可以加入 glue 包,让日志输出告别厚重的 sprintf。
library(purrr)
library(glue)
# 1. 生成所有组合(全覆盖矩阵)
combinations <- expand.grid(
cmb = c("cmb1", "cmb2"),
mode = c("mode1", "mode2"),
option = c("opt1", "opt2"),
stringsAsFactors = FALSE
)
# 2. pmap 遍历:每一行自动映射为函数参数
pmap(combinations, function(cmb, mode, option) {
# 打印运行日志
message(glue("✅ Running: {cmb} | {mode} | {option}"))
# 执行核心分析函数
main(dir_sets, cmb, option, mode)
})
结语
代码的水平,往往体现在如何处理“重复”和“复杂”。
- 用
format_name解决字符串的纵向深度。 - 用
pmap解决逻辑遍历的横向广度。
💡 互动
你在处理多组学数据时,还有哪些觉得“不爽”的重复操作?欢迎在评论区留言,我们一起“优雅化”。
、