1 回答

TA貢獻1880條經(jīng)驗 獲得超4個贊
首先,我認為你的解決方案過于復雜,使得它對于 Snakemake 來說不太慣用。因此,您在執(zhí)行該規(guī)則時遇到了問題。無論如何,讓我按照您提出的問題來回答這個問題。
兩個文件相同也就不足為奇了Nreads_DIRx.txt,因為輸入不依賴于輸出中的任何通配符:
rule concatNreads:
input:
expand(INDIR+'/{dir}/{smp}_Nreads.txt', dir_samples, dir=DIRS, smp=SAMPLES)
這里,該expand函數(shù)解析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))
現(xiàn)在的問題是如何實現(xiàn)這個func為目錄生成樣本列表的函數(shù)。我花了一段時間才理解您使用combine_dir_samplesand的技巧filter_combinator,所以我將其留給您func使用該代碼實現(xiàn)該函數(shù)。但你真正需要的是 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})
添加回答
舉報