如何解决访问由 Snakemake 中的函数返回的列表的特定元素
在我的 Snakemake 工作流程中,我定义了一个函数,该函数使用之前在工作流程中生成的文件,对其进行解析并返回一个包含 2 个元素的列表,例如:
def get_param_value(wildcards) :
# do stuff with the wildcards and some files
return ["element1","element2"]
然后我想在后续规则中使用返回列表的每个值作为独立的 params
,例如:
rule example :
input :
'input_file.txt'
output :
'output_file.txt'
params :
param1 = "element1",# First element of the list returned by get_param_value function
param2 = "element2" # Second element of the list returned by get_param_value function
shell :
'somecommand -i {input} -smth1 {params.param1} -smth2 {params.param2} -o {output} ;'
我试过直接在规则中使用该函数,用
params :
param1 = get_param_value[0],param2 = get_param_value[1]
但我得到一个 TypeError : 'function' object is not subscriptable
(这是预期的,因为它是一个函数)。
您有解决此问题的方法吗?
解决方法
你很接近。您可以避免使用 lambdas 并使用函数,只需将其名称放在不带括号或方括号(如 params: funcname
)的位置。具有该名称的函数随后会被 Snakemake 自动调用,并且通配符也会被传递。
这可以在您的上下文中应用如下:
def get_param_value(wildcards) :
return ["elem1","elem2"]
rule example :
output :
'output_file.txt'
params :
string_list = get_param_value
shell :
'echo -param1 {params.string_list[0]} -param2: {params.string_list[1]}'
您可以自己运行它,这是一个最小(工作)示例,在执行时会产生以下结果:
$ snakemake -np -c1
rule example:
output: output_file.txt
jobid: 0
resources: tmpdir=/var/folders/5_/6_lmbd65717dly07dk7r7q200000gn/T
echo "param1: elem1" "param2: elem2"
在 documentation 中阅读有关在规则属性中使用函数的更多信息。
,你可以这样做:
def get_param_value(wildcards,index) :
with open('file_from_workflow_using_wildcards') as file :
# do stuff
res = ["element1","element2"]
return res[index]
rule example :
input :
'input_file.txt'
output :
'output_file.txt'
params :
param1 = get_param_value(wildcards,0),# First
param2 = get_param_value(wildcards,1) # Second
shell :
'somecommand -i {input} -smth1 {params.param1} -smth2 {params.param2} -o {output} ;'
或者更好地使用代码中的函数:
res = get_param_value(wildcards)
params :
param1 = res[0],param2 = res[1]
,
经过一番修补并感谢Mario Abbruscato 的建议,我想出了一个解决方案。我改变了两件事:
- 我将函数返回的列表存储在一个对象中并返回此对象,而不是直接返回列表:
def get_param_value(wildcards) :
with open('file_from_workflow_using_wildcards') as file :
# do stuff
params_list = ["element1","element2"]
return params_list
- 我在规则的
params
指令中使用了 lambda 函数来提取列表的元素并将它们分配给不同的参数:
rule example :
input :
'input_file.txt'
output :
'output_file.txt'
params :
param1 = lambda wildcards : get_param_value(wildcards)[0],param2 = lambda wildcards : get_param_value(wildcards)[1]
shell :
'somecommand -i {input} -smth1 {params.param1} -smth2 {params.param2} -o {output} ;'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。