params: 블록과 {params}

앞서 보았듯이, 입력 및 출력 블록은 Snakemake가 작동하는 방식의 핵심입니다. 요청된 출력을 생성하는 데 필요한 입력을 바탕으로 Snakemake가 규칙을 자동으로 연결할 수 있게 해주기 때문입니다. 하지만 입력 및 출력 블록은 몇 가지 제약이 있습니다. 특히, 입력 및 출력 블록의 모든 항목은 반드시 파일 이름이어야 한다는 점입니다. 또한 Snakemake의 작동 방식상 입력 및 출력 블록에 지정된 파일 이름은 워크플로가 해당 규칙을 통과하기 위해 실제로 존재해야 합니다.

종종 셸 명령어는 파일 이름이 아닌 다른 파라미터를 받아야 할 때가 있으며, 이러한 파라미터는 Snakemake에 의해 계산될 수 있거나 계산되어야 하는 값일 수 있습니다. 따라서 Snakemake는 셸 블록에서 파일 이름이 아닌 파라미터 문자열을 제공할 수 있는 params: 블록도 지원합니다. 아래에서 보시겠지만, 이는 사용자 정의 파라미터뿐만 아니라 Python 코드로 자동 계산되는 파라미터 등 다양한 목적으로 사용될 수 있습니다.

params 블록의 간단한 예시

다음 코드를 살펴보세요.

rule use_params:
    params:
        val = 5
    output: "output.txt"
    shell: """
        echo {params.val} > {output}
    """

여기서 값 5params: 블록의 val이라는 이름에 할당되었으며, 셸 블록에서 {params.val}이라는 이름으로 사용할 수 있습니다. 이는 입력 및 출력 블록에서 키워드를 사용하는 방식과 유사하지만, 입력 및 출력 블록과 달리 params 블록에서는 키워드 사용이 필수입니다.

이 예제에서는 기능적인 이득은 없지만 가독성 측면에서 이점이 있습니다. 이 구문은 val이 셸 블록의 세부 사항을 이해하지 않고도 수정할 수 있는 조정 가능한(tunable) 파라미터임을 명확하게 보여줍니다.

params 블록은 와일드카드에 접근할 수 있습니다

input:output: 블록과 마찬가지로, 와일드카드 값은 wildcards 접두사 없이도 params: 블록에서 직접 사용할 수 있습니다. 즉, 표준 문자열 서식 지정 작업을 사용하여 문자열 내에서 와일드카드를 활용할 수 있습니다.

이는 셸 명령어가 파일 이름이 아닌 다른 것을 사용해야 할 때 유용합니다. 예를 들어, bowtie 리드 정렬 소프트웨어는 -S 옵션을 통해 출력 SAM 파일의 접두사를 받는데, 이는 bowtie ... -S {output}으로는 정확한 파일 이름을 지정할 수 없음을 의미합니다. 대신 {params.prefix}를 다음과 같이 사용할 수 있습니다.

# 대상: -n

# ANCHOR: 내용
rule all:
    input:
        "reads.sam"

rule use_params:
    input: "{prefix}.fq",
    output: "{prefix}.sam",
    params:
        prefix = "{prefix}"
    shell: """
        bowtie index -U {input} -S {params.prefix}
    """
# ANCHOR_END: 내용

만약 여기서 -S {output}을 사용했다면, 결과적으로 reads.sam.sam이라는 파일이 생성되었을 것입니다!

params 블록은 다양한 다른 기능도 지원합니다

(추후 확장 예정)

링크 및 참고 자료: