Snakemake 使用字典扩展

Snakemake Using expand with dictionary

我正在写这条规则:

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 将根据 ref 值从字典 my_dictionary 中获取值。我用了 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 in place

有什么解决方法的建议吗?

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

(至于为什么 wildcards没有在input中定义,不知道...)

正如@dariober 提到的,存在 wildcards 对象,但这只能在 run/shell 部分访问,但可以使用 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 函数示例实现它,它应该可以解决您提到的问题:

The function worked but it did not resolve the variable between double curly braces so it will ask for input for {dataset}/{sample}.{ref}.{state}.{case}and raise an error.