2017-03-08 19 views
2

次の例では、出力ファイルは入力ファイルと同じ場所に作成されます。出力セクションにワイルドカード値のbasenameを取得する方法があるので、入力ファイルのベース名を使用して出力ファイルに名前を付けることはできますが、別の場所に書き込むことはできますか?snakemake出力ルールでワイルドカード値のベース名を取得するにはどうすればよいですか?

答えて

3

SnakeMakeでこれを行うには、Pythonのlambda機能を使用する方法があります。最初に、あなたは、キーと、このような値としてパスを持つファイルとしてファイルの名前を持つファイルの辞書を

を作成する必要があります。

files = {'filesA' : 'path/to/fileA.ext', 'filesB' : 'path/to/fileB.ext'} 

をこの辞書はsnakefileまたはにすることができ構成ファイル。ここでは、2つのルールを持っているコード、allと呼ばれる最初のもので

rule all : 
input : 
    #If you want to create in a different directory use this, 
    #but it has to be like output from rule one. 
    #expand('{directory}{filename}{extension}', 
      #directory = 'path/to/newdir', 
      #filename = config['dictname'].keys(), 
      #extension = '.out') 
    #Otherwise 
    expand('{filename}{extension}', 
      filename = config['dictname'].keys(), 
      extension = '.out') 
rule one: 
input: lambda wildcards: config['dictname'][wildcards.input] 

output: "{input}" + ".out" 

message: "Executing one using {input}" 

shell: "touch {input}.out" 

:私は、設定ファイルにそれを置くと、このconfig['dict_name']

ようにそれを呼び出すことが示唆だから今のはlambda機能を使用してルールを書いてみましょう実行されます。したがって、snakemakeを起動すると、expand機能によって作成されたリストに対応するファイルのリストを取得したいことがあります。

Snakemakeはルールがそのファイルのリストを生成するかどうかを調べます。そうでない場合、ディレクトリ内でそれらを検索します。あなたはexpandディレクトリ、ファイル名、接尾辞、接頭辞、拡張子であなたが望むすべてのものを指定することができます見ることができるように、...この例では

は、Snakemakeはキーの辞書と拡張.outのファイル名を持ついくつかのファイルを持って望んでいます。ルールoneはそれらを生成するための完全なルールです。

ルールoneは、次のように動作します。辞書の各キーについて、ルールが実行されます。入力セクションのラムダ関数がこの役割を果たします。 レコードの場合、ワイルドカードは任意の名前で呼び出すことができます。inputは単なる例です。あなたは変数で、このようなラムダ関数の内容を置くことができ、よりエレガント的には

_input_One = lambda wildcards: config['dictname'][wildcards.input] 

次に、このようなルール1つの入力、書き込み:詳細については

input: _input_One 

をご確認ください。 https://snakemake.readthedocs.io/en/stable/

ヒューゴ

+0

私は試しました辞書の方法とそれは完全に動作します。 – Veera

+0

ありがとうございます。ファイル名の数が2だけでなく200になる場合、どうすればいいですか?それで、それぞれを一つ一つ書くことは不可能ですか? – bapors

関連する問題