如何解决Snakemake:使用通配符访问 dict 中的列表
为了分解它,我有一个看起来像这样的字典:
dict = {'A': ["sample1","sample2","sample3"],'B': ["sample1","sample2"],'C': ["sample1","sample3"]}
我有一个规则:
rule example:
input:
#some input
params:
# some params
output:
expand('{{x}}{sample}',sample=dict[wildcards.x])
# the alternative I tried was
# expand('{{x}}{sample}',sample=lambda wildcards: dict[wildcards.x])
log:
log = '{x}.log'
run:
"""
foo
"""
我的问题是如何以通配符.x 为键访问字典,以便获取与通配符对应的项目列表作为键。 第一个例子只是给了我
名称“通配符”未定义
而另一种选择只是给了我
缺少所有规则的输入文件 由于snakemake 甚至不运行示例规则。
我需要使用 expand,因为我希望规则对每个 x 通配符只运行一次,同时在这一次运行中创建多个样本。
解决方法
您只能在 input
部分中将 lambda 用作通配符的函数,而不能在 output
部分中使用。实际上输出没有任何通配符,它定义它们。
让我们从另一个角度重新思考您的任务。你如何决定输出产生多少样本?您正在定义 dict
:这些信息来自哪里?您还没有显示实际的脚本,但它如何知道要产生多少输出?
从逻辑上讲,您可能有三个独立的规则(或至少两个),一个知道如何生成两个样本,另一个知道如何生成三个样本。
正如我所看到的,您遇到了问题 XY:您问了两次相同的问题,但您没有表达您的实际问题 (X),同时通过将所有输出定义为字典 (Y) 来迫使不正确的实现.
更新:另一个可能的解决方案是使用 dynamic
输出:
rule example:
input:
#some input
output:
dynamic('{x}sample{n}')
这适用于您的情况,因为文件与常见模式“sample{n}”匹配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。