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.
我正在写这条规则:
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.