1 回答
TA贡献1880条经验 获得超4个赞
首先,我认为你的解决方案过于复杂,使得它对于 Snakemake 来说不太惯用。因此,您在执行该规则时遇到了问题。无论如何,让我按照您提出的问题来回答这个问题。
两个文件相同也就不足为奇了Nreads_DIRx.txt,因为输入不依赖于输出中的任何通配符:
rule concatNreads:
input:
expand(INDIR+'/{dir}/{smp}_Nreads.txt', dir_samples, dir=DIRS, smp=SAMPLES)
这里,该expand函数解析dir和smp变量,生成完全指定的文件名列表。您需要的是真正取决于输出中的通配符的东西:
rule concatNreads:
input:
lambda wildcards: ...
是{dir}使用输出中的通配符完全指定的,因此您不需要从变量中为其分配值DIRS:
rule concatNreads:
input:
lambda wildcards: expand(INDIR+'/{dir}/{smp}_Nreads.txt', dir=wildcards.dir, smp=func(wildcards.dir))
现在的问题是如何实现这个func为目录生成样本列表的函数。我花了一段时间才理解您使用combine_dir_samplesand的技巧filter_combinator,所以我将其留给您func使用该代码实现该函数。但你真正需要的是 DIR -> SAMPLES 中的地图:
dir_to_samples = {"DIR1": ["smp1", "smp2"], "DIR2": ["smp3", "smp4"]}
def func(dir):
return dir_to_samples[dir]
这dir_to_samples可能可以更容易地评估,但这是您修改后的解决方案:
for dir in DIRS:
samples, = glob_wildcards(INDIR+'/'+dir+'/{smp}.fastq.gz')
dir_to_samples.append({dir: samples})
添加回答
举报