2017-06-29 2 views
2

Ich benutze Snakemake, um eine Pipeline zu entwickeln. Ich versuche, symbolische Verknüpfungen für jede Datei in einem Verzeichnis zu einem neuen Ziel zu erstellen. Ich weiß nicht im Voraus, wie viele Dateien es gibt, also versuche ich die dynamische Ausgabe zu verwenden.dynamische Ausgabe in Snakemake

rule source: 
     output: dynamic('{n}.txt') 
     run: 
      source_dir = config["windows"] 
      source = os.listdir(source_dir) 
      for w in source: 
       shell("ln -s %s/%s source/%s" % (source_dir, w, w)) 

Dies ist der Fehler, den ich bekommen:

WorkflowError: „. Zielregeln Platzhalter enthalten darf nicht Bitte geben konkrete Dateien oder eine Regel ohne Platzhalter“

Was ist das Problem?

+0

Ich habe noch nie 'dynamic' probiert, aber die Beispiele in der Dokumentation haben eine andere Art der Verwendung als das, was Sie tun: http://snakemake.readthedocs.io/en/stable/snakefiles/rules.html # dynamische Dateien. Insbesondere gibt es eine treibende 'all'-Regel, die das dynamische Zeug als Eingabe hat. Hast du eine solche Regel? – bli

Antwort

4

Für die Verwendung von dynamischer Funktion müssen Sie eine andere Regel, wo der Eingang die dynamischen Dateien wie diese sind:

rule target : 
    input : dynamic('{n}.txt') 

rule source: 
    output: dynamic('{n}.txt') 
    run: 
    source_dir = config["windows"] 
    source = os.listdir(source_dir) 
    for w in source: 
     shell("ln -s %s/%s source/%s" % (source_dir, w, w)) 

Gefallen Sie dieses Snakemake wird wissen, was für die Wildcard-Attribut hat.

Hinweis, wenn Sie einen Platzhalter verwenden, müssen Sie ihn immer definieren. Hier definiert der Aufruf von dynamic in der Eingabe der Zielregel den Platzhalter '{n}'.

Verwandte Themen