我正在写这条规则:
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
任何建议如何解决?
答案 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}并引发错误。