我有以下情况
A_Out
中创建文件(1或2)A_Out
中的所有文件作为输入,并在B_Out
中生成文件(1或2)我正在使用以下代码,
checkpoint A:
output: directory("A_Out")
# Rest of the logic
def collect_a(wildcards):
path = checkpoints.A.get(**wildcards).output[0]
return expand("{path}/{file}.txt",
path=path,
file=glob_wildcards(os.path.join(path, "{name}.txt")).name)
checkpoint B:
input: collect_a
output: directory("B_Out")
# Rest of the logic
def collect_b(wildcards):
path = checkpoints.B.get(**wildcards).output[0]
return expand("{path}/{file}.txt",
path=path,
file=glob_wildcards(os.path.join(path, "{name}.txt")).name)
def conditional_input(wildcards):
if condition_A:
return collect_a(wildcards)
else:
return collect_b(wildcards)
rule c:
input: conditional_input
# Rest of the logic
在上述情况下,当condition_a为False
时,它仅评估检查点B,而不评估检查点A。如何解决此问题?还是还有其他优雅的方式?
答案 0 :(得分:0)
这些级联的检查点调用非常有问题,并且存在一些与之相关的问题。如果您进一步充实示例,可以假定您使用的是最新版本的snakemake,可以将问题提交给github。
作为一种解决方法,您可以尝试在每个目录中添加一个临时信号文件以指示规则已完成。然后,您需要在规则代码中添加通配符。
不太好,但是可以工作。因为您有一个临时输入作为信号,所以即使其他文件已经存在,规则也会每次重新运行。 snakemake不知道它们是输出。另一种选择是预先检查您的输入,以确定是否将生成一个或两个文件,然后将其绕过检查点与您的输入函数逻辑联系起来。