You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Snakemake中从TXT文件读取路径并循环处理文件

问题描述

我有一段R脚本,它能读取名为scenarios.txt的文本文件,根据文件里的信息读取不同位置的文件并处理。scenarios.txt内容如下:

scenario    name    directory
2017    Dijn    2017-v0
2022    Pikn    2030-v1
2040    Enn     2040

(注:原第三行的Enn 2040应为分隔开的字段,已修正格式)

对应的R脚本示例(已修正语法错误):

library(tidyverse)
library(sf)
ss = read.delim("Simulations/scenarios.txt")
for(i in seq(nrow(ss))){
  gps = st_read(paste0("/usd/clove/simulations/", ss$directory[i], "/trips_gps.gpkg"))
  st_write(gps, paste0("/usd/clove/simulations/", ss$directory[i], "/trips_gps_", ss$name[i], ".gpkg"))
}

请问如何编写对应的Snakemake文件,实现从该TXT文件读取路径来执行批量任务?


实现思路

Snakemake的核心是规则+输入输出映射,我们需要先从scenarios.txt读取任务参数,再为每个场景生成独立的处理任务。

完整代码实现

1. 单场景处理的R脚本(命名为process_gps.R)

把原循环脚本改成接收命令行参数的单任务版本,方便Snakemake逐个调用:

library(sf)

# 从命令行读取输入、输出路径
args <- commandArgs(trailingOnly = TRUE)
input_path <- args[1]
output_path <- args[2]

# 读取并写入文件
gps <- st_read(input_path)
st_write(gps, output_path)

2. Snakefile文件内容

# 读取scenarios.txt,生成任务参数列表
import pandas as pd

# 读取表格,按制表符分隔(若为其他分隔符可调整sep参数,比如sep="\s+"匹配任意空白)
scenarios = pd.read_csv("Simulations/scenarios.txt", sep="\t")
# 构建每个任务的输入输出映射
tasks = [
    {
        "input": f"/usd/clove/simulations/{row.directory}/trips_gps.gpkg",
        "output": f"/usd/clove/simulations/{row.directory}/trips_gps_{row.name}.gpkg"
    }
    for _, row in scenarios.iterrows()
]

# 定义总目标:所有处理后的输出文件
rule all:
    input:
        expand("{output}", output=[task["output"] for task in tasks])

# 定义单场景处理规则
rule process_gps:
    input:
        lambda wildcards: next(t["input"] for t in tasks if t["output"] == wildcards.output)
    output:
        "{output}"
    shell:
        "Rscript process_gps.R {input} {output}"

补充说明

  • 运行Snakemake时,在终端执行snakemake -j [线程数]即可批量处理,例如snakemake -j 4用4个线程并行处理。
  • 若需要传递更多场景参数到R脚本,可在shell命令中添加参数,同时修改R脚本的commandArgs部分接收。

内容的提问来源于stack exchange,提问作者Thaatha_Paati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 11:33:02