我刚刚开始使用 Snakemake,我无法理解通配符。我的工作流程将有一个具有以下结构的输入数据目录:
data/
├─ somedataset/
│ ├─ somesubset.csv
│ ├─ someothersubset.csv
├─ seconddataset/
│ ├─ somesubsetofsecond.csv
│ ├─ yetanothersubset.csv
│ ├─ andyetanothersubset.csv
如果没有在我的配置中指定可能的数据集和子集,我希望拥有下面的输出结构。因此,每个输入子集都会被接收输入文件列表的脚本分割成固定数量的分区。
output/
├─ somedataset/
│ ├─ somesubset_01.csv
│ ├─ somesubset_02.csv
│ ├─ someothersubset_01.csv
│ ├─ someothersubset_02.csv
├─ seconddataset/
│ ├─ somesubsetofsecond_01.csv
│ ├─ somesubsetofsecond_02.csv
│ ├─ yetanothersubset_01.csv
│ ├─ yetanothersubset_02.csv
│ ├─ andyetanothersubset_01.csv
│ ├─ andyetanothersubset_02.csv
如何使用通配符实现此目的?我已经尝试过这个例子:
wildcard_constraints:
dataset=r"\w+",
subset=r"\w+"
rule test:
input:
"data/{dataset}/{subset}.csv"
output:
expand("output/{dataset}/{subset}_{partition}.csv", partition=["01", "02"])
shell:
"python scripts/test.py {input}"
但这会导致“没有为通配符‘数据集’给出任何值。
或者,当我尝试这个时:
datasets = ["somedataset", "seconddataset"]
for dataset in datasets:
rule:
name: f"process_{dataset}"
input:
expand("data/{dataset}/{subset}.csv", dataset=[dataset], subset=subsets)
output:
expand("output/{dataset}/{subset}_{partition}.csv", dataset=[dataset], subset=subsets, partition=["01", "02"])
shell:
"python scripts/test.py {input}"
我明白了
No rule to produce 1
。