首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我不想制作文件夹时,Snakemake检查点是如何工作的?

当我不想制作文件夹时,Snakemake检查点是如何工作的?
EN

Stack Overflow用户
提问于 2021-11-24 12:06:10
回答 1查看 316关注 0票数 1

我有一个snakemake文件,其中一条规则生成一个来自女巫的文件,我想提取标题并在我的规则中作为通配符使用。Snakemake指南提供了一个示例,在这个示例中,它创建了类似通配符的新文件夹,但是如果我能够避免这种情况,那将是很好的,因为在某些情况下,它需要创建100-200个文件夹。对如何使它发挥作用有什么建议吗?

链接到snakemake指南:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html

代码语言:javascript
运行
复制
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是选项卡分隔的,可以如下所示:

代码语言:javascript
运行
复制
FID IID Apple   Banana  Plum
Mouse   Mickey  0   0   1
Mouse Minnie    1   0   1
Duck    Donnald 0   1   0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-26 20:06:22

我觉得你误解了蛇形检查站的例子。您只需要在您的情况下创建一个文件夹。它们在文件夹名中有一个通配符(sample),但是输出名称的这一部分是提前知道的。

代码语言:javascript
运行
复制
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)

因为你没有提前知道所有的名字(水果),所以你不能把它们包括在所有的规则中。您需要引用一条中间规则来将所有的内容整合在一起。也许可以使用最终报告文件:

代码语言:javascript
运行
复制
rule all:
   input: 'report.txt'

然后在检查站之后:

代码语言:javascript
运行
复制
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}"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70095796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档