Parameters Snakemake:展开参数

Parameters Snakemake:展开参数,parameters,expand,snakemake,Parameters,Expand,Snakemake,我正在尝试构建一个简单的工作流,将参数列表提供给脚本。举例说明: SAMPLES=['A','B'] rule test: params: sample=expand("{sample}", sample=SAMPLES) script: "test.py {params.sample}" 但是,snakemake仅使用示例A执行脚本,而不是B。换句话说,我相信它正在执行python test.py ab,而不是python test.py A

我正在尝试构建一个简单的工作流,将参数列表提供给脚本。举例说明:

SAMPLES=['A','B']

rule test:
    params:
        sample=expand("{sample}", sample=SAMPLES)
    script:
        "test.py {params.sample}"
但是,snakemake仅使用示例
A
执行脚本,而不是
B
。换句话说,我相信它正在执行
python test.py ab
,而不是
python test.py A
然后执行
python test.py B
。同样,我认为这一点可以从以下几个方面得到说明:

SAMPLES=['A','B']

rule print_samples:
    params:
        sample=expand("{sample}", sample=SAMPLES)
    script:
        "echo {params.sample} \n"
我希望看到
A
B
分别打印在不同的行上,但它在同一行上打印
ab


我是否遗漏了expand与params的工作方式?理想情况下,我希望添加
-j
标志以并行运行它们(此时
-j
仅使用
A
执行)。

这是预期的输出。在本例中,Expand只是

[样本中样本的str(样本)]
当输入到shell或脚本时,这些项目会在
ab
之间加上一个空格

相反,您需要一个适用于任何示例的通用规则(您还需要一个输出文件):

规则测试:
输出:“{sample}.out”
外壳:
“test.py{wildcards.sample}”#不需要参数,假设它将输出{sample}.out写入
这里test.py是一个可执行文件。 因此,当您请求A.out时,
test.py A
运行,对于B.out,您将得到
test.py B

下一步,你必须要求你想要的输出。这通常是snakefile中的第一条规则,称为all:

规则所有:
输入:展开({sample}.out',sample=SAMPLES)
同样,“展开”将为您提供一个示例列表,在您的情况下,“规则全部”变为:

rule all:
   input: 'A.out', 'B.out'
指定输出文件后,snakemake确定规则测试需要运行两次,一次使用A,一次使用B


因此,请记住,为任何一个示例编写规则作为泛化。您可能只需要在规则all中展开一次,就可以为每个示例专门化规则。Snakemake负责确定需要运行什么,如果您给它额外的内核,它可以同时执行单独的作业。

谢谢,这为我清理了很多事情!但是,当我运行您的代码时(我还在
输出:“{sample}.out”
”周围添加了引号),我得到了以下错误:
名称“通配符”在此上下文中是未知的。请确保您定义了该变量。还要注意,不用于变量访问的大括号必须通过重复它们来转义,即{{print$1}
有什么想法吗?另一条信息:我只有在使用
脚本时才会出现此错误:
。如果我这样做:
shell:“python test.py{wildcards.sample}”
它工作得很好。我从未使用过
script
指令。我使用
shell
run
。似乎
script
应该只采用脚本的路径,而不使用命令行参数。脚本将在内部通过
snakemake
变量访问内容:你们都是对的!对不起,我是在抄袭原来的问题;我也通常使用shell。编辑以修复这两个打字错误,并进一步解释了python脚本。