缘由

生信之路,道阻且长。记录一点避坑经验,愿能渡有缘人。

碎碎念

“及时当勉励,岁月不饶人。” ——陶渊明

告别繁琐嵌套:像 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 解决逻辑遍历的横向广度。

💡 互动

你在处理多组学数据时,还有哪些觉得“不爽”的重复操作?欢迎在评论区留言,我们一起“优雅化”。
、