Snakemake:访问输入函数返回的列表的特定元素

阿蒂博

在我的 snakemake 工作流程中,我定义了一个函数,该函数使用之前在工作流程中生成的文件,对其进行解析并返回一个包含 2 个元素的列表,例如:

def get_param_value(wildcards) :
    with open('file_from_workflow_using_wildcards') as file :
        # do stuff
        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(这是预期的,因为它是一个函数)。

你有解决方法吗?

阿蒂博

经过一番修补并感谢Mario Abbruscato的建议,我想出了一个解决方案。我改变了两件事:

  1. 我将函数返回的列表存储在一个对象中并返回此对象,而不是直接返回列表:
def get_param_value(wildcards) :
    with open('file_from_workflow_using_wildcards') as file :
        # do stuff
        params_list = ["element1","element2"]
        return params_list
  1. 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} ;'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章