>

이 규칙은 이전 반복의 출력을 입력으로 사용하도록 루프 내에서 Snakemake 규칙을 사용하려고합니다. 가능합니까? 그렇다면 어떻게 할 수 있습니까?

여기에 예가 있습니다

<올>
  • 테스트 데이터 설정
  • mkdir -p test
    echo "SampleA" > test/SampleA.txt
    echo "SampleB" > test/SampleB.txt
    
    

    1. 스네이크 메이크
    SAMPLES = ["SampleA", "SampleB"]
    rule all:
        input:
            # Output of the final loop
            expand("loop3/{sample}.txt", sample = SAMPLES)
    
    #### LOOP ####
    for i in list(range(1, 4)):
        # Setup prefix for input
        if i == 1:
            prefix = "test"
        else:
            prefix = "loop%s" % str(i-1)
        # Setup prefix for output
        opref =  "loop%s" % str(i)
        # Rule
        rule loop_rule:
            input:
                prefix+"/{sample}.txt"
            output:
                prefix+"/{sample}.txt"
                #expand("loop{i}/{sample}.txt", i = i, sample = wildcards.sample)
            params:
                add=prefix
            shell:
                "awk '{{print $0, {params.add}}}' {input} > {output}"
    
    

    예제를 실행하려고하면 ERROR CreateRuleException in line 26 of /Users/fabiangrammes/Desktop/Projects/snake_loop/Snakefile: The name loop_rule is already used by another rule 가 생성됩니다. . 누군가 그 일을 할 수있는 옵션을 발견하면 좋을 것입니다!

    감사합니다!

    • 답변 # 1

      재귀 프로그래밍을 사용할 수있는 좋은 기회라고 생각합니다. 반복마다 조건을 명시 적으로 포함시키지 않고 반복 (n-1) 에서 전환하는 단일 규칙을 작성하십시오.   n 로 . 따라서 다음과 같은 내용이 있습니다 :

      SAMPLES = ["SampleA", "SampleB"]
      rule all:
          input:
              expand("loop3/{sample}.txt", sample=SAMPLES)
      def recurse_sample(wcs):
          n = int(wcs.n)
          if n == 1:
              return "test/%s.txt" % wcs.sample
          elif n > 1:
              return "loop%d/%s.txt" % (n-1, wcs.sample)
          else:
              raise ValueError("loop numbers must be 1 or greater: received %s" % wcs.n)
      rule loop_n:
          input: recurse_sample
          output: "loop{n}/{sample}.txt"
          wildcard_constraints:
              sample="[^/]+",
              n="[0-9]+"
          shell:
              """
              awk -v loop='loop{wildcards.n}' '{{print $0, loop}}' {input} > {output}
              """
      
      

      @RussHyde가 말했듯이 무한 루프가 트리거되지 않도록 적극적으로해야합니다. 이를 위해 모든 사례가 recurse_sample 로 보장됩니다.   wildcard_constraints 를 사용하십시오.  정확하게 이해하기 위해.

    • 답변 # 2

      내 이해는 규칙이 실행되기 전에 규칙이 파이썬 코드로 변환되고이 프로세스 동안 Snakefile에 존재하는 모든 원시 파이썬 코드가 순차적으로 실행된다는 것입니다. 뱀 함수 규칙을 파이썬 함수로 평가한다고 생각하십시오.

      하지만 모든 규칙은 함수에 대해 한 번만 평가할 수 있어야한다는 제약이 있습니다.

      if/else 식을 가질 수 있고 구성 값 등을 기반으로 규칙을 한 번만 평가할 수 있지만 규칙을 여러 번 평가할 수는 없습니다.

      원하는 것을 달성하기 위해 Snakefile을 다시 작성하는 방법을 잘 모르겠습니다. 루핑 구조가 필요한 것처럼 보일 수있는 실제 사례가 있습니까?

      --- 편집

      고정 반복 횟수의 경우 규칙을 여러 번 실행하기 위해 입력 함수를 사용할 수 있습니다. (하지만이 작업을 수행하지 않도록주의하고 무한 루프를 허용하지 않도록 매우주의하십시오)

      SAMPLES = ["SampleA", "SampleB"]
      rule all:
          input:
              # Output of the final loop
              expand("loop3/{sample}.txt", sample = SAMPLES)
      def looper_input(wildcards):
          # could be written more cleanly with a dictionary
          if (wildcards["prefix"] == "loop0"):
              input = "test/{}.txt".format(wildcards["sample"])
          else if (wildcards["prefix"] == "loop1"):
              input = "loop0/{}.txt".format(wildcards["sample"])
          ...
          return input
      
      rule looper:
          input:
                  looper_input
          output:
                  "{prefix}/{sample}.txt"
          params:
                  # ? should this be add="{prefix}" ?
                  add=prefix
          shell:
                  "awk '{{print $0, {params.add}}}' {input} > {output}"
      
      

  • 이전 javascript - 마법사 sapui5를 재설정하는 방법
  • 다음 objective c - iPhone에서 벨소리가 울리는 동안 비디오가 재생되면 오디오가 없습니다 YouTube-Player-iOS-Helper 사용