如何在Snakemake中读取字典输入并解决NameError问题
Snakemake调用字典中FastQ路径时报NameError的解决方法
问题场景
我将FastQ文件路径存储在字典中,尝试在Snakemake规则里访问这些路径,但运行代码时触发NameError。
我的代码:
infile_loc = { "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"], "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"] } SAMPLES = infile_loc.keys() rule print_file_name: input: expand("{sample}", sample=SAMPLES) params: read1, read2 = lambda wildcards: infile_loc[wildcards.sample] script: """ echo {params.read1} echo {params.read2} """
运行后报错:
NameError in file /home/joshua/snakemake_works/Snakefile, line 9: name 'read1' is not defined File "/home/joshua/snakemake_works/Snakefile", line 9, in <module>
错误原因
Snakemake的params块不支持直接使用read1, read2 = lambda...这种变量解构语法。这里的read1和read2在当前上下文属于未定义变量,因此触发NameError。
两种解决方法
方法1:为每个参数单独编写lambda表达式
直接给read1和read2分别指定lambda,从字典的列表值中提取对应位置的路径:
infile_loc = { "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"], "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"] } SAMPLES = infile_loc.keys() rule print_file_name: input: expand("{sample}", sample=SAMPLES) params: read1=lambda wildcards: infile_loc[wildcards.sample][0], read2=lambda wildcards: infile_loc[wildcards.sample][1] script: """ echo {params.read1} echo {params.read2} """
方法2:让lambda返回字典映射参数
让lambda函数返回包含read1和read2键的字典,Snakemake会自动将字典键映射为params的属性:
infile_loc = { "Sample1": ["/home/joshua/snakemake_works/input/Sample1_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample1_R2.fq.gz"], "Sample2": ["/home/joshua/snakemake_works/input/Sample2_R1.fq.gz", "/home/joshua/snakemake_works/input/Sample2_R2.fq.gz"] } SAMPLES = infile_loc.keys() rule print_file_name: input: expand("{sample}", sample=SAMPLES) params: lambda wildcards: { "read1": infile_loc[wildcards.sample][0], "read2": infile_loc[wildcards.sample][1] } script: """ echo {params.read1} echo {params.read2} """
额外优化提示
原代码中input: expand("{sample}", sample=SAMPLES)没有指向实际文件,若规则不需要依赖输入文件可直接删除;如果需要关联FastQ文件作为输入,可改为:
input: expand("/home/joshua/snakemake_works/input/{sample}_R{1,2}.fq.gz", sample=SAMPLES)
内容的提问来源于stack exchange,提问作者Joshua Jebaraj
相关产品推荐
相关产品推荐

