Snakemake中如何获取函数返回列表的特定元素作为规则params参数
解决方案
Snakemake的params字段传入函数时,会在规则执行时自动传入wildcards参数并执行函数,你需要把「取下标」的逻辑也封装到可被Snakemake自动执行的可调用对象中,不能直接对函数本身取下标,以下是三种可行方案:
方案1:用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} ;'
方案2:封装独立取值函数(适合多规则复用场景)
如果多个规则都需要用到这两个参数,可以单独封装小函数避免重复写lambda:
def get_param1(wildcards): return get_param_value(wildcards)[0] def get_param2(wildcards): return get_param_value(wildcards)[1] rule example : input : 'input_file.txt' output : 'output_file.txt' params : param1 = get_param1, param2 = get_param2 shell : 'somecommand -i {input} -smth1 {params.param1} -smth2 {params.param2} -o {output} ;'
方案3:单函数返回完整参数字典(适合参数多、函数执行开销大的场景)
上面两个方案会重复调用两次get_param_value,如果该函数需要读文件、执行复杂计算,可以用单函数返回参数字典,仅调用一次get_param_value:
def get_all_params(wildcards): res = get_param_value(wildcards) return {"param1": res[0], "param2": res[1]} rule example : input : 'input_file.txt' output : 'output_file.txt' params = get_all_params shell : 'somecommand -i {input} -smth1 {params.param1} -smth2 {params.param2} -o {output} ;'
Snakemake支持直接给params赋值返回字典的函数,返回字典的键会自动对应为params的属性,和手动写键值对效果完全一致。
内容的提问来源于stack exchange,提问作者athiebaut
相关产品推荐
相关产品推荐

