Snakemake使用字典扩展

时间:2018-11-13 22:26:59

标签: expand snakemake

我正在写这条规则:

rule process_files:
    input: 
        dataout=expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref]) 
    output:
        "{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
    shell:
        do something ...

expand将基于my_dictionary的值从字典ref获得值。我像这样wildcards使用了my_dictionary[wildcards.ref]。但这最终会导致错误name 'wildcards' is not defined

my_dictionary类似: {A:[1,2,3], B:[s1,s2..].....}

我可以使用

def myfun(wildcards):
    return expand("{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_dictionary[wildcards.ref])

并使用myfun作为输入,但这不能回答为什么我不能直接使用expand

任何建议如何解决?

2 个答案:

答案 0 :(得分:0)

您的问题似乎与snakemake wildcards or expand command类似,最重要的是,输入中未定义wildcards。因此,使用输入函数(或lambda函数)的解决方案似乎是正确的。

(关于为什么 wildcards未在输入中定义,我不知道...)

答案 1 :(得分:0)

如@dariober所述,有wildcards个对象,但这仅在运行/外壳部分可用,但可以使用input中的输入函数进行访问。

这是一个示例实现,它将基于wildcards.ref展开输入:

rule all:
    input: expand("{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv", dataset=["D1", "D2"], sample=["S1", "S2"], ref=["R1", "R2"], state=["STATE1", "STATE2"], case=["C1", "C2"])


my_list = {"R1": [1, 2, 3], "R2": ["s1", "s2"]}

rule process_files:
    input:
        lambda wildcards: expand(
            "{{dataset}}/{{sample}}.{{ref}}.{{state}}.{{case}}.myresult.{name}.tsv", name=my_list[wildcards.ref])
    output:
        "{dataset}/{sample}.{ref}.{state}.{case}.endresult.tsv"
    shell:
        "echo '{input}' > {output}"

如果您将其实现为上面的lambda函数示例,它将解决您提到的问题:

  

该函数有效,但是它没有解析双花括号之间的变量,因此它将要求输入{dataset} / {sample}。{ref}。{state}。{case}并引发错误。