我有一个snakemake文件,其中一条规则生成一个来自女巫的文件,我想提取标题并在我的规则中作为通配符使用。Snakemake指南提供了一个示例,在这个示例中,它创建了类似通配符的新文件夹,但是如果我能够避免这种情况,那将是很好的,因为在某些情况下,它需要创建100-200个文件夹。对如何使它发挥作用有什么建议吗?
链接到snakemake指南:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html
import pandas as pd
rule all:
input:
final_report = expand('report_{fruit}.txt', fruit= ???)
rule create_file:
input:
output:
fruit = 'fruit_file.csv'
run:
....
rule next:
input:
fruit = 'fruit_file.csv'
output:
report = 'report_{phenotype}.txt'
run:
fruit_file = pd.read_csv({input.fruit}, header = 0, sep = '\t')
fruits= fruit_file.columns.tolist()[2:]
for i in fruits:
cmd = 'touch report_' + i + '.txt'
shell(cmd)这是一个简化的工作流,因为我实际上正在使用一些长脚本来生成pheno_file.csv和报表文件。
pheno_file.csv是选项卡分隔的,可以如下所示:
FID IID Apple Banana Plum
Mouse Mickey 0 0 1
Mouse Minnie 1 0 1
Duck Donnald 0 1 0发布于 2021-11-26 20:06:22
我觉得你误解了蛇形检查站的例子。您只需要在您的情况下创建一个文件夹。它们在文件夹名中有一个通配符(sample),但是输出名称的这一部分是提前知道的。
checkpoint fruit_reports:
input:
fruit = 'fruit_file.csv'
output:
report_dir = directory('reports')
run:
fruit_file = pd.read_csv({input.fruit}, header = 0, sep = '\t')
fruits= fruit_file.columns.tolist()[2:]
for i in fruits:
cmd = f'touch {output}/report_{i}.txt'
shell(cmd)因为你没有提前知道所有的名字(水果),所以你不能把它们包括在所有的规则中。您需要引用一条中间规则来将所有的内容整合在一起。也许可以使用最终报告文件:
rule all:
input: 'report.txt'然后在检查站之后:
def aggregate_fruit(wildcards):
checkpoint_output = checkpoints.fruit_reports.get(**wildcards).output[0]
return expand("reports/report_{i}.txt",
i=glob_wildcards(os.path.join(checkpoint_output, "report_{i}.txt")).i)
rule report:
input:
aggregate_input
output:
"report.txt"
shell:
"ls 1 {input} > {output}"https://stackoverflow.com/questions/70095796
复制相似问题