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

Workflow 子工作流和includes指令之间的实际区别是什么?[毒蛇],workflow,snakemake,Workflow,Snakemake,在Snakemake文档中,可以将另一个工作流的所有规则合并到主工作流中,显然可以在Snakemake--dag-n | dot-Tsvg>dag.svg中显示,另一方面,如果您开发依赖于其输出的规则,则可以在主工作流之前执行 我的问题是:这两者到底有什么不同?现在,我正在处理一个工作流,似乎只需使用includes并将输出的名称放入主工作流的rule all中即可。我甚至可以将输出放在主工作流规则的输入中,使包含工作流在该规则之前执行。此外,无论出于何种原因,我无法将包含子工作流的DAG可视化

在Snakemake文档中,可以将另一个工作流的所有规则合并到主工作流中,显然可以在
Snakemake--dag-n | dot-Tsvg>dag.svg
中显示,另一方面,如果您开发依赖于其输出的规则,则可以在主工作流之前执行


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

我从未使用过子工作流,但在这里,使用它们可能比使用
include
指令更方便。(理论上,我认为您不需要
包含
子工作流
,因为您可以将所有内容都写在一个庞大的蛇形文件中,重点在于方便。)

假设您正在编写一个工作流,该工作流依赖于已发布作品(或您以前的项目)的结果文件。作者没有公开您需要的文件,但他们提供了一个蛇形工作流来生成这些文件。他们的snakemake工作流可能非常复杂,您需要的文件可能只是中间步骤。所以,您不用理解所有工作流并将其解析为自己的
include
指令,而是使用
子工作流
生成所需的文件。例如:


include
不“合并其他工作流”。它只是从另一个文件中添加规则,就像使用“复制/粘贴”添加规则一样(有一个细微的区别,即
include
不会影响目标规则)。
子工作流
具有一组独立的规则,这些规则共同工作以生成此子工作流的最终目标文件。因此,它结构良好,与主工作流和其他子工作流都是隔离的

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

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',
    ...