Snakemake中当前规则的名称

11

我正在使用Snakemake工作,但我找不到访问当前规则名称的方法。

例如,是否有一种像这样的访问方式:

rule job1:
    input: check_inputs(rules.current.name)
    output: ...

check_inputs函数在每个规则中更多或更少相同时,这非常有帮助。

当然,我做过这个并且它有效:

rule job1:
    input: check_inputs("job1")
    output: ...

不过,我在想是否存在更加“Snakemaker way”获取当前规则名称的方法,以避免每次编写/硬编码规则名称。

任何形式的帮助或建议都将不胜感激。

--- 编辑1 ---
当Snakemake解析inputoutput语句时,规则名称仅可通过{rules.myrule.name}进行访问。因此,在input/output定义中无法使用{rules.myrule.name}

这个想法是快速访问当前规则的名称,例如{rules.current},因为{rules.myrule.name}也很重复。

2个回答

3

(编辑:提出一种解决方法)

{rule}可以在 shell:/run: 指令中用于规则名称。正如 op 所述,在 input/output: 中无法使用此方法。不过,当前的模板是一种替代方法。

myrule = "foo"
rule foo:
    output: touch(myrule + ".ok")
    shell:
        'echo "I am {rule}, making {output}"'

在上面的例子中,引入变量myrule是不必要的,因为它只使用了一次。但是当您想在各种snakemake指令中多次使用规则名称时,这样做更有意义。此外,它还方便了规则模板化。

感谢 @gutorm 提供的解决方法。对于“log”参数来说,这个功能真是太好了。 - mrhd

1

谢谢您的答复。不,它还没有生效。当输入和输出被snakemake解析时,rule.name会被定义。我已经检查了Rules对象(其中包含所有规则及其属性),发现仅在输出定义后才出现。但是感谢您提供的问题链接,我将为此创建一个新问题。除非有其他人找到了这个问题的解决办法。 - glihm
刚好遇到了这个问题。在运行/ shell块之前仍然无法访问规则名称。现在在Github上有一个跟踪它的问题:https://github.com/snakemake/snakemake/issues/156 - mrhd

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