Snakemake 展开字典,保留通配符

问题描述 投票:0回答:2

我有一本像下面这样的字典:

data = {
    "group1": ["a", "b", "c"], 
    "group2": ["x", "y", "z"]
}

我想使用 expand 来分别获取键和它们的值之间的所有组合 在“全部统治”中,s.t.预期的输出文件是例如"group1/a.txt", "group1/b.txt", ... "group2/x.txt, "group2/y.txt" ...

rule all: 
    input: 
        expand("{group}/{sub_group}.txt", group = ???, sub_group = ???)

规则“some_rule”需要这个:


rule some_rule: 
    input: "single_input_file.txt"
    output: "{group}/{sub_group}.txt"
    params: 
        group=group, # how do I extract these placeholders?
        sub_group=sub_group
    script: 
        "some_script.R"

我需要

group
sub_group
通配符的原因是因为我需要将它们传递给规则“some_rule”的
params

我尝试使用列表理解对“全部规则”中所需的所有输出文件进行硬编码,但是占位符未在通配符中定义,我无法将它们传递给参数。

所以我想我需要使用

expand
定义“规则所有”输入文件,但在这里我不知道如何获得正确的文件,因为我需要在“group1”和它的之间单独执行组合值和“group2”及其值。

我也不能为规则“some_rule”使用输入函数,因为它只有一个单一的静态输入文件。

在 StackOverflow 上的其他类似问题中,要么没有组合问题,要么他们使用纯 python 创建“rule_all”的输入文件,这让我失去了通配符。

python snakemake
2个回答
0
投票

您可以使用嵌套列表理解

data = {
    "group1": ["a", "b", "c"], 
    "group2": ["x", "y", "z"]
}

files = sum(
    [
        [f"{key}/{value}.txt" for value in values] for key,values in data.items()],
    []
)

print(files)

我想你打算在每个文件上运行一个程序?如果是这样:

for file in files:
     # run script on `file`

0
投票

你可以使用这个:

rule some_rule: 
    input: "single_input_file.txt"
    output: "{group}/{sub_group}.txt"
    script: 
        "some_script.R"

并访问 R 中通配符

{group}
{subgroups}
的值 脚本与例如
snakemake@wildcards[['group']]
(未测试,但我认为 应该这样做)。

或者我认为你可以:

params:
    group='{group}'
    sub_group='{sub_group}',
© www.soinside.com 2019 - 2024. All rights reserved.