如何在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
相关产品推荐
相关产品推荐

