子工作流和 includes 指令之间的实际区别是什么? [蛇形]

What is the practical difference between a sub-workflow and the includes directive? [Snakemake]

另一方面,在 Snakemake 文档中,如果您开发依赖于其输出的规则,includes directive can incorporate all of the rules of another workflow into the main workflow and apparently can show up in snakemake --dag -n | dot -Tsvg > dag.svg. Sub-workflows 可以在主工作流之前执行。

我的问题是:这两者到底有何不同?现在,我正在处理一个工作流,似乎我可以只使用 includes 并将输出的名称放在主工作流的 rule all 中。我什至可以将输出放在主工作流规则的 input 中,使 includes 工作流在该规则之前执行。此外,无论出于何种原因,我都无法想象包含子工作流的 DAG。子工作流提供了哪些 includes 指令不能做的事情?

我从未使用过子工作流,但在这种情况下,使用它们可能比 include 指令更方便。 (理论上,我认为你不需要 includesubworkflow 因为你可以把所有东西都写在一个巨大的 Snakefile 中,重点更多的是方便。)

假设您正在编写一个工作流,该工作流依赖于已发表作品(或您之前的项目)的结果文件。作者没有制作 public 您需要的文件,但他们提供了一个 snakemake 工作流程来生成它们。他们的 snakemake 工作流程可能非常复杂,您需要的文件可能只是中间步骤。因此,您无需理解所有工作流程并将其解析为您自己的 include 指令,而是使用 subworkflow 生成所需的文件。例如:

subworkflow jones_etal:
    workdir:
        "./jones_etal"
    snakefile:
        "./jones_etal/Snakefile"

rule all:
    input:
        'my_results.txt',

rule one:
    input:
        jones_etal('from_jones.txt'),
    output:
        'my_results.txt',
    ...

include 没有 "incorporate another workflow"。它只是添加来自另一个文件的规则,就像您使用 copy/paste 添加它们一样(有一点不同,即 include 不会影响您的目标规则)。 subworkflow 有一组独立的规则,这些规则协同工作以生成此子工作流的最终目标文件。因此它结构良好,与主工作流和其他子工作流隔离。

无论如何,我个人的经验表明,Snakemake 中存在一些错误,使得使用子工作流非常困难。包含该文件非常简单易行。