如何在Snakemake中仅运行一个规则。

10

我在Snakemake中创建了一个工作流程,当我想要运行单个规则时遇到了问题。实际上,它为我运行那些输出是该规则输入的规则,即使这些规则已经在之前创建过了。

例如:

rule A:
 input A
 output A

rule b:
 input b = output A
 output b

rule c:
 input c = output b
 output c

我该如何只运行规则 C?


你用什么命令来运行snakemake?最好能给我们展示一个真实的例子,而不是伪代码,因为代码可能存在问题。 - Manavalan Gajapathy
默认情况下,snakemake 仅运行工作流程的第一个规则。如果其输入不可用,则会查找其他规则以生成它们。 - rioualen
4
如果没有更具体的例子,我无法提供实质性的帮助,但你可以尝试使用--until 参数进行实验。在snakemake的帮助文档中,--until TARGET [TARGET ...], -U TARGET [TARGET ...] 可以运行管线直到达到指定的规则或文件。仅运行指定规则或文件依赖的作业,不运行同级DAGs(有向无环图)。 - Russ Hyde
@JeeYem snakemake -p my_rule --config run-date=22_01_2019。my_rule作为输入使用了前一个规则(x)的输出,但在我的情况下,这个输出已经生成,当我想运行my_rule时,它会从规则(x)开始。 - BioManil
@rioualen 这是我的问题,对我来说输入是可用的,所以我不理解。 - BioManil
1
代码似乎有问题。看到实际的代码会更有帮助。 - Manavalan Gajapathy
4个回答

7
您可以使用 --allowed-rules 选项。
snakemake --allowed-rules c

Snakemake会尝试重新运行与您下游规则相关联的输入/输出链中的上游规则,如果上游规则的输出文件已更改(包括如果它们已被重新创建但内容没有更改)。这种行为使Snakemake具有可重复性,但如果您正在尝试调试管道的特定部分并且不想运行所有中间步骤,则可能不是理想的。

请参见此讨论: https://bitbucket.org/snakemake/snakemake/issues/688/execute-specified-rule-only-and-not


7
如果存在依赖关系,我发现只有使用--until才能运行规则C,只需运行snakemake -R --until c即可。 如果存在假设的依赖关系,例如共享的输入或输出路径,则会强制您在不使用--until的情况下运行上游规则。始终先以-n进行干运行。

5

你只需要运行:

snakemake -R b

要预先查看这将会做什么:

snakemake -R b -n

-R 选中一个规则(以及它所依赖的所有规则!),-n 进行“干运行”,只会输出不执行。


6
有没有一种方法可以运行某个规则而不运行依赖的规则?例如,如果我在snakemake之外生成输入文件,那么我能否运行以这些文件作为输入的特定规则? - helicase
1
我正在使用snakemake 5.16.0,但似乎没有-R参数。 - Phoenix Mu
2
这对我没用。我发现--until更好用。 - Dan Bolser
--forcerun, -R:强制重新执行或创建给定的规则或文件。如果您更改了某个规则并希望所有输出在工作流中得到更新,请使用此选项。(Snakemake文档) - Muhammed Hasan Celik

-3

我认为 "--force" = "-f" 是这里所要求的:

snakemake --force c
snakemake -f c

--force, -f 强制执行所选目标或第一个规则,而不考虑已创建的输出。(默认值:False)
--forceall, -F 强制执行所选(或第一个)规则及其依赖的所有规则,而不考虑已创建的输出。(默认值:False)
--forcerun [TARGET ...], -R [TARGET ...] 强制重新执行或创建给定的规则或文件。如果您更改了规则并希望更新工作流中所有输出,请使用此选项。(默认值:None)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接