파트 2: Hello Channels - 동영상 강의 스크립트¶
AI 지원 번역 - 자세히 알아보기 및 개선 제안
참고
이 페이지는 스크립트만 제공합니다. 전체 단계별 지침은 과정 자료를 참조하세요.
스크립트에 표시된 섹션 번호는 참고용으로만 제공되며, 자료의 모든 섹션 번호를 포함하지 않을 수 있습니다.
환영합니다¶
안녕하세요, Hello Nextflow 파트 2에 오신 것을 환영합니다. 이번 챕터의 이름은 Hello Channels입니다.
채널은 Nextflow 파이프라인의 접착제와 같습니다. 채널은 서로 다른 프로세스들을 연결하는 요소로, Nextflow가 모든 정보를 전달하고 워크플로우를 조율하는 데 사용됩니다.
채널과 함께 사용되는 또 다른 요소로 연산자가 있습니다. 연산자는 채널에 사용하여 내용을 변환할 수 있는 함수입니다. VS Code를 열어 현재 상태를 확인합니다.
VS Code를 크게 확대해 두었으므로, 화면을 깔끔하게 유지하기 위해 챕터 1에서 생성된 .nextflow* 파일, work/ 디렉토리, results/ 등을 모두 삭제하고 새로 시작합니다. 하지만 너무 걱정하지 않아도 됩니다. 원하지 않는다면 해당 파일들을 그대로 두어도 문제가 발생하지 않습니다.
이번 챕터에서는 hello-channels.nf 파일로 작업을 시작합니다. 이 파일을 열면 이전에 작업했던 파일과 매우 유사하게 보일 것입니다. 스크립트의 일부 내용이 다른 위치에 있을 수 있지만, 기본적으로 동일합니다.
한 가지 다른 점은 출력 블록의 경로가 이번 파트에서는 hello_channels로 설정되어 있다는 것입니다. 이전 results 디렉토리가 남아 있더라도 결과 파일이 다른 하위 디렉토리에 저장되므로, 출력 결과에 혼동 없이 깔끔하게 시작할 수 있습니다.
이 스크립트가 실행될 때 어떤 동작을 하는지 간단히 복습합니다. "nextflow run hello-channels.nf" 를 실행하고 "--input myinput" 을 지정하면, params.input 매개변수가 sayHello 프로세스에 변수로 전달되어 greeting으로 사용되고 output.txt에 저장됩니다. 결과 파일에서 이를 확인할 수 있습니다.
1. 채널을 통해 변수 입력값 명시적으로 제공하기¶
이 방식은 간단하지만 다소 단순합니다. 매개변수에 변수가 하나뿐이고, 프로세스가 한 번만 실행되어 확장성이 없습니다. 여러 파일이나 여러 인사말을 처리할 수 없고, 단 하나만 처리할 수 있습니다.
실제로 Nextflow는 분석을 확장하는 것이 핵심입니다. 따라서 하나 이상의 작업을 처리해야 하며, 이를 위해 채널을 사용합니다.
채널은 Nextflow를 처음 접하는 많은 분들에게 다소 생소한 개념입니다. 함수형 프로그래밍의 개념에서 비롯된 것으로, 익숙해지는 데 시간이 걸릴 수 있습니다. 하지만 한번 이해하면 Nextflow의 강력한 기능을 활용할 수 있으며, 워크플로우 작성의 핵심이 됩니다.
1.1. 입력 채널 생성하기¶
이 스크립트에서 param 대신 채널을 사용하도록 수정합니다.
워크플로우 블록으로 이동합니다. 이곳은 모든 워크플로우 로직이 연결되는 곳입니다. 여기에 새로운 채널을 생성합니다.
새 채널을 생성합니다.
이름은 "greeting_ch" 로 지정합니다. "_ch" 접미사를 붙이는 것은 이 변수가 채널임을 기억하기 위한 관례입니다. 물론 원하는 이름으로 지정해도 됩니다.
그런 다음 등호를 입력하고 "channel.of" 를 작성합니다.
Channel은 채널과 관련된 모든 것의 네임스페이스입니다. 이전에 Nextflow를 사용해 본 적이 있다면 소문자 "c"를 사용합니다. ".of" 는 채널 팩토리라고 불리는 것으로, 채널을 생성하는 방법 중 하나입니다.
채널 팩토리는 다양한 종류가 있습니다. "."만 입력하면 VS Code가 여러 옵션을 제안하는 것을 볼 수 있습니다. ".of" 는 가장 단순한 방식으로 입력값을 받습니다.
괄호를 열고 "Hello Channels!" 를 입력합니다.
채널이 생성되었습니다. 저장하고 다시 실행할 수 있지만, 아직 특별한 변화는 없습니다. VS Code가 주황색 경고 표시를 보여주며, 채널을 생성했지만 실제로 사용하지 않았다고 알려줍니다. 이 채널이 소비되지 않고 있습니다.
이 채널을 어떻게 사용할까요? 간단합니다. 이것을 복사하고 params.input 을 삭제한 후 그 자리에 "greeting_ch" 를 입력합니다. 이 채널을 sayHello의 입력으로 전달합니다.
현재는 이 문자열을 하드코딩했습니다. 이전 챕터 마지막에 사용했던 매개변수보다 다소 후퇴한 것처럼 보이지만, 로직을 이해하기 쉽도록 단순하게 시작하는 것입니다.
터미널에서 워크플로우를 다시 실행합니다. 이번에는 "--input" 없이 실행하면, 생성한 채널을 사용하여 실행됩니다. results/hello_channels/ 에 파일이 생성되고 "Hello Channels!" 가 출력됩니다. 채널이 의도한 대로 동작하고 있습니다.
1.4. view()를 사용하여 채널 내용 확인하기¶
채널에서 사용할 수 있는 또 다른 함수인 ".view" 를 간단히 소개합니다.
이것은 Python이나 다른 언어의 print 명령과 유사하며, 실행 시 채널의 내용을 터미널에 출력합니다.
".view" 를 추가하고 워크플로우를 다시 실행하면, 채널이 생성된 시점의 내용이 터미널에 출력됩니다.
터미널에 "Hello Channels!" 가 출력된 것을 확인할 수 있습니다.
원하는 경우 여러 줄로 나눌 수 있으며, 실제로 Nextflow 자동 포매터가 이를 자동으로 처리합니다. 공백은 중요하지 않으므로 이러한 요소들을 연속으로 연결할 수 있습니다.
2. 여러 입력값으로 워크플로우 실행하기¶
채널에 하나의 항목이 있는 것은 좋지만, 이전과 기본적으로 동일합니다. 조금 더 복잡하게 만들어 채널에 항목을 추가합니다.
".of()" 채널 팩토리는 여러 항목을 받을 수 있으므로 몇 가지를 더 추가합니다. Hello, Bonjour, Hej 를 입력하고 워크플로우를 다시 실행하여 결과를 확인합니다.
실행하면 view 구문을 통해 "Hello", "Bonjour", "Hej" 가 터미널에 출력됩니다.
2.1.2. 명령 실행 및 로그 출력 확인하기¶
여기서 끝난 것처럼 보일 수 있지만, 실제로는 주의해야 할 함정이 있습니다. 출력 파일을 확인하면 "Hello" 만 있고 다른 출력은 없습니다. 실제로 이 하나의 파일만 존재합니다.
워크플로우를 여러 번 실행하면 때로는 "Bonjour", 때로는 "Hej" 가 나타날 수 있습니다. 다소 무작위적입니다.
터미널을 보면 세 번 실행되었고 서로 다른 view 출력을 확인할 수 있습니다. work 디렉토리에서 "cat work" 를 실행하고 해시를 확장하여 output.txt 를 확인하면, work 디렉토리의 파일이 results 디렉토리와 다르며 "Hej" 가 저장되어 있습니다. 무언가 제대로 작동하지 않고 있습니다.
핵심은 세 개의 작업이 실행되었다는 것입니다. Nextflow 출력은 터미널을 완전히 차지하지 않도록 처리 과정을 요약하여 표시하며, ANSI 로깅이 ANSI 이스케이프 코드를 사용하여 다른 작업들을 덮어씁니다. 따라서 마지막으로 업데이트된 작업만 표시됩니다.
2.1.3. -ansi-log false 옵션으로 명령 다시 실행하기¶
이를 더 잘 이해하기 위한 몇 가지 방법이 있습니다. work 디렉토리를 직접 확인할 수 있지만, 여러 Nextflow 실행 결과가 섞여 있어 다소 혼란스러울 수 있습니다.
또는 Nextflow에 ANSI 이스케이프 코드를 사용하지 않도록 지정할 수 있습니다.
명령을 다시 실행할 때 "-ansi-log false" 를 추가하면 비활성화됩니다. 환경 변수 $NO_COLOR 또는 "$NXF_ANSI_LOG=false" 를 사용할 수도 있습니다. 이렇게 하면 이스케이프 코드 없이 구식 스타일의 Nextflow 로깅을 사용하여 터미널에 직접 출력됩니다.
이제 실행된 세 개의 프로세스를 모두 확인할 수 있으며, 각각 고유한 작업 해시가 있습니다. 이 work 디렉토리들을 확인하면 지정한 세 가지 인사말을 볼 수 있습니다.
이제 더 명확하게 이해됩니다. Nextflow가 이 작업을 수행하고 있었지만, 터미널에서 work 디렉토리를 표시하는 방식이 다소 영리했던 것입니다.
하지만 work 디렉토리 문제는 해결되었지만, 출력 파일 문제는 아직 해결되지 않았습니다. 여전히 "Hello" 가 저장된 출력 파일이 하나뿐입니다.
2.2. 출력 파일 이름의 고유성 보장하기¶
이를 이해하려면 워크플로우 스크립트로 돌아가야 합니다. 채널을 생성하고 프로세스에 전달하는데, 프로세스를 보면 인사말을 "output.txt" 라는 파일에 저장하고 출력 블록을 통해 게시합니다.
그런데 이 프로세스가 세 번 실행되어 세 개의 작업이 생성됩니다. 모두 "output.txt" 라는 파일을 생성하고, 이 출력 파일들이 모두 results 디렉토리에 게시되면서 서로 덮어씁니다. 따라서 results 디렉토리에 있는 파일은 마지막으로 생성된 것이며, 나머지는 모두 덮어쓰여집니다. 이것은 원하는 결과가 아닙니다.
2.2.1. 동적 출력 파일 이름 구성하기¶
이를 처리하는 다양한 방법이 있지만, 지금 가장 간단한 방법은 고유한 파일 이름을 생성하는 것입니다. 각 작업이 다른 인사말로 실행될 때 다른 출력 파일을 생성하면, 게시 시 충돌이 발생하지 않습니다. 그러면 세 개의 고유한 출력 파일을 얻을 수 있습니다.
방법은 동일합니다. script 블록 내 어디서든 이 변수를 사용할 수 있으며 여러 번 사용할 수도 있습니다.
"${greeting}_output.txt" 를 붙여넣고, 더 이상 output.txt 라는 파일을 생성하지 않으므로 위쪽도 동일하게 수정해야 합니다. 수정하지 않으면 Nextflow가 생성되지 않은 파일을 기대한다는 오류를 발생시킵니다.
동일하게 수정하고, 변수가 올바르게 인식되도록 작은따옴표가 아닌 큰따옴표를 사용해야 합니다.
워크플로우를 다시 실행합니다. 세 개의 서로 다른 work 디렉토리에서 세 개의 작업이 실행되고, 왼쪽 results 폴더에 서로 다른 파일 이름과 각각의 내용을 가진 세 개의 파일이 생성된 것을 확인할 수 있습니다. 파일들이 더 이상 서로 덮어쓰지 않으며, 모든 결과가 예상대로 존재합니다.
다소 단순한 예제이지만, 파일 게시 방식과 주의해야 할 함정에 대한 핵심 개념을 잘 보여줍니다. 이를 통해 자신의 워크플로우에서 이러한 문제를 피할 수 있습니다.
또한 여기서 한 작업이 실제 상황에서는 다소 비실용적이라는 점도 언급할 가치가 있습니다. 입력 데이터를 사용하면서 그 데이터를 기반으로 파일 이름을 지정하는 방식은 일반적으로 사용하기 어렵습니다.
따라서 실제 성숙한 Nextflow 파이프라인에서는 주어진 샘플과 관련된 모든 메타데이터를 포함하는 meta 객체를 전달하는 경우가 많습니다. 이를 기반으로 동적 파일 이름을 생성하면 훨씬 더 실용적입니다.
이에 대한 모범 사례가 궁금하다면, training.nextflow.io 에 메타데이터와 meta map에 관한 사이드 퀘스트가 있으니 참고하세요.
3. 배열을 통해 여러 입력값 제공하기¶
다음으로 채널의 구조와 코딩 언어의 다른 데이터 구조와의 차이점을 살펴봅니다. 다른 언어를 사용해 본 적이 있다면 익숙한 개념인 배열을 채널에서 사용할 수 있는지 생각해 봅니다.
채널에서 배열을 사용할 수 있을까요? 시도해 봅니다. 문서에서 복사한 "greetings_array" 배열을 생성하고 "Hello", "Bonjour", "Holà" 를 입력합니다. 그런 다음 하드코딩된 문자열 대신 이것을 사용합니다. "channel.of" "greetings_array" 로 이 배열을 채널에 전달합니다.
터미널을 열고 파이프라인을 실행합니다.
view 구문이 배열을 예상대로 출력했지만, 빨간색 텍스트(또는 "-ansi-log" 가 꺼져 있다면 다른 색상)가 문제가 발생했음을 알려줍니다.
더 이상 녹색 체크 표시가 없고 빨간색 X 표시가 있습니다. 화면을 조금 넓혀서 읽기 쉽게 하면 Nextflow가 무엇이 잘못되었는지 알려줍니다.
섹션별로 분석합니다. 오류의 원인과 이유가 표시되는데, 출력 파일이 없다는 것입니다. 출력 블록에서 이 파일이 생성되어야 한다고 했지만 생성되지 않았습니다. 다음으로 실행된 명령이 표시됩니다. 이것은 모든 변수가 대입된 후의 .command.sh 파일 내용입니다.
echo 명령이 한 번만 실행되었고 전체 배열을 문자열 표현으로 사용했음을 확인할 수 있습니다. 이것은 원하는 결과가 아닙니다.
명령이 종료되었고, 더 자세히 확인할 수 있는 work 디렉토리가 표시됩니다.
즉, Nextflow가 이 전체 배열을 단일 채널 요소로 프로세스에 전달했고, 프로세스가 한 번만 실행되어 하나의 작업만 생성되었으며 데이터를 예상한 구조로 사용하지 못했습니다.
3.2. 연산자를 사용하여 채널 내용 변환하기¶
따라서 채널을 사용하기 전에 먼저 변환이 필요합니다. 이것이 연산자를 사용하는 배경입니다. 연산자는 채널 내용을 조작하기 위해 채널에 사용할 수 있는 특수 함수입니다.
이 경우 flatten 을 사용합니다. 채널 끝에 추가하면 채널을 생성한 후 flatten 을 실행합니다. VS Code에서 마우스를 올리면 이 명령의 문서가 바로 표시되어 매우 유용합니다. Nextflow 웹사이트 문서에서도 모든 내용을 확인할 수 있습니다.
바로 실행해도 되지만, 연산자와 Nextflow 코드 내에서 동적 코드를 작성하는 방법인 클로저를 소개할 좋은 기회입니다.
flatten 실행 전에 view 명령을 추가합니다. 중괄호가 있는 동적 클로저입니다. 클로저 내에는 view 연산자의 컨텍스트 내에서 실행될 임의의 코드가 있습니다.
여기서 greeting은 view 연산자의 입력값입니다. 원하는 이름으로 지정할 수 있으며, 예를 들어 "foo" 로 지정하면 나중에 "foo" 로 참조하면 됩니다. 그런 다음 이것을 반환합니다.
변수를 포함한 문자열을 반환하여 flatten 전의 상태를 표시합니다. 매우 간단합니다.
이제 동일한 것을 하나 더 추가하되, flatten 이후라고 표시합니다.
이것은 순서대로 실행되므로, flatten 실행 전과 후의 채널 모습을 확인할 수 있습니다.
그런 다음 greeting 채널이 여전히 생성되어 프로세스에 전달됩니다. 이제 워크플로우가 실행될 것입니다.
파이프라인이 이번에는 오류 없이 실행되었습니다. 세 개의 프로세스가 정상적으로 실행되었고 체크 표시가 있습니다. view 구문도 작동했습니다.
flatten 전에는 이전 실패에서 본 배열이 표시되고, flatten 후에는 "Hello", "Bonjour" 등 세 개의 개별 요소가 표시됩니다. 배열의 세 요소가 이제 채널의 세 개의 개별 요소가 되었습니다.
view 연산자가 세 번 실행된 것을 확인할 수 있습니다. flatten 후 채널에 세 개의 요소가 있으므로 연산자가 세 번 호출됩니다.
간단히 언급하자면, 이전에 채널 팩토리를 생성할 때 "."을 입력하면 다양한 채널 생성 방법이 표시되는데, 그 중 "fromList" 가 있습니다. 이것은 동일한 작업을 위해 특별히 설계된 것입니다. 따라서 fromList greetings_array를 사용하면 됩니다. 구문이 더 간결하고 깔끔합니다. 하지만 이 데모에서는 채널이 어떻게 조작되고 다른 연산자가 채널 내용을 어떻게 변경하는지 단계별로 보여주기 위해 이 방식을 사용했습니다.
4. CSV 파일에서 입력값 읽기¶
이제 좀 더 현실적으로 만들어 봅니다. Nextflow 파이프라인에서 하드코딩된 배열을 많이 작성하고 싶지는 않을 것입니다. 실행 시 외부에서 데이터를 가져오고 싶을 것이며, 그 데이터는 거의 확실히 파일에 있을 것입니다.
다음으로 이것을 재현하되, 단일 CLI 매개변수나 하드코딩된 문자열 또는 배열에서 데이터를 가져오는 대신 파일에서 가져옵니다.
greetingsarray를 제거하고 채널 팩토리를 변경합니다. 다양한 옵션 중 ".fromPath" 를 사용하여 이 경우 _params.input 을 전달합니다. 이전에 사용했던 입력으로 돌아가는 것입니다.
이 매개변수는 아직 준비가 되지 않았습니다. 여전히 기본값이 하드코딩된 문자열로 설정되어 있지만, 이제는 파일이 필요합니다. 타입이 다릅니다. 더 이상 String 이 아니라 Path 입니다.
원한다면 기본값을 Path로 설정할 수 있습니다. 왼쪽 탐색기를 보면 이 저장소의 작업 디렉토리에 data 디렉토리가 있고 그 안에 "greetings.csv" 파일이 있습니다.
기본값을 "data/greetings.csv" 로 설정합니다. 이제 명령줄 옵션 없이 파이프라인을 실행하면 이 기본값을 사용합니다. Path임을 알고 있으므로 문자열이 아닌 경로로 처리합니다.
그런 다음 params.input 에서 채널 팩토리로 전달하여 채널을 생성하고, sayHello 프로세스에서 사용됩니다.
실패했습니다. 걱정하지 마세요. 예상된 결과입니다. 교육 자료를 따라가고 있다면 거기서도 예상된 결과임을 확인할 수 있습니다. 무슨 일이 일어나고 있는지 확인합니다.
파이프라인을 실행하려 했고 프로세스를 실행하려 했지만, 이전에 본 것과 매우 유사한 오류가 발생했습니다.
echo 를 실행하려 했지만, CSV 파일의 내용을 출력하는 대신 경로를 출력했습니다. 이 CSV 파일의 전체 절대 경로가 표시됩니다.
그런 다음 이 복잡한 경로에 쓰려고 했기 때문에 어떻게 해야 할지 몰랐습니다. 프로세스 work 디렉토리의 범위를 벗어났습니다.
처음에 언급했듯이 Nextflow는 실행된 모든 작업을 특수한 work 디렉토리 내에 캡슐화합니다. 해당 work 디렉토리 외부의 데이터에 쓰려고 하면 Nextflow가 안전 예방 조치로 이를 차단합니다. 절대 경로에 쓰려고 했고 Nextflow가 이를 방지했습니다.
4.2. splitCsv() 연산자를 사용하여 파일 파싱하기¶
이 채널을 확인하고 어떻게 보이는지 살펴봅니다. 웹사이트에서 복사한 .view 를 추가합니다. 동적 클로저가 있고 입력으로 변수 이름 "csv" 를 사용합니다. 이것이 채널 내용이며 splitCsv 전의 모습입니다.
다시 실행하면 여전히 실패하지만 채널 내부를 보여줍니다. 특별히 흥미롭지는 않습니다. path 변수입니다. 터미널에 출력되므로 문자열처럼 보이지만, 이 파일에 대한 정보와 메타데이터를 포함하는 path 객체입니다.
파일의 메타데이터를 입력으로 전달하고 싶지 않습니다. 파일의 내용을 전달하고 싶습니다. greetings.csv 파일을 보면 Hello, Bonjour, Holà 등의 변수가 있습니다. 파일 자체를 단일 객체로 전달하는 것이 아니라 이것들을 프로세스에 전달하고 싶습니다.
따라서 이 CSV 파일을 파싱해야 합니다. 압축을 풀고 CSV 파일의 내용을 가져와서 채널을 통해 프로세스에 전달해야 합니다.
로그 메시지에서 알 수 있듯이 splitCsv 를 사용해야 합니다. 또 다른 채널 연산자입니다. "."을 입력하고 "s"를 입력하면 자동 완성이 제안됩니다. splitCsv 와 괄호를 입력합니다.
splitCsv 후에 또 다른 view 구문을 추가하여 이후의 모습을 확인합니다. 파이프라인을 실행하여 결과를 확인합니다.
실패했지만 새로운 방식으로 실패했습니다. 이것은 진전입니다.
이번에도 스크립트에 문제가 있습니다. 더 이상 최종 경로가 없지만, 이전에 배열을 고정 입력으로 전달할 때 본 오류와 매우 유사한 변수 배열이 있습니다.
view 연산자의 로깅을 통해 splitCsv 전에는 경로였고, splitCsv 후에는 세 개의 서로 다른 출력이 있으며 각각 greetings.csv 파일의 각 행과 매우 유사하게 보입니다. 이것은 당연한 결과입니다.
즉, Nextflow가 이 CSV 파일을 파싱하여 CSV 파일의 각 줄에 대해 하나씩 세 개의 객체를 반환했습니다. 그런 다음 단일 문자열 값 대신 변수 배열을 채널에 세 번 전달했습니다.
이전에 이 문제가 발생했을 때 flatten 을 사용했습니다. 빠르게 flatten을 시도하여 어떻게 되는지 확인합니다.
변수 이름은 원하는 대로 지정할 수 있으므로, 더 이상 CSV가 아니므로 myarray 로 지정합니다. flatten 으로 다시 실행하여 어떻게 되는지 확인합니다.
이번에는 CSV를 세 개의 배열 객체로 파싱하고 flatten을 적용했습니다. 파이프라인이 통과되었습니다. 하지만 flatten 이 모든 것을 완전히 평탄화하여 각 행의 세 개의 독립적인 배열 항목을 얻게 됩니다. 프로세스가 CSV의 모든 행에 대해 세 번씩 실행되었습니다. 결과 파일이 많이 생성되었고 1, 2, 3, 4, 5, 6 등 원하는 CSV의 첫 번째 열만이 아닌 모든 것이 포함되었습니다.
4.3. map() 연산자를 사용하여 인사말 추출하기¶
첫 번째 열만 가져오려면 어떻게 해야 할까요? flatten이 너무 단순하다면, 실제로 원하는 것을 지정할 수 있는 더 복잡한 연산자가 필요합니다.
이를 위해 map 을 사용합니다. map 은 기본적으로 주어진 모든 요소에 대해 어떤 코드나 함수를 실행하고 변환을 수행합니다. 매우 유연하기 때문에 Nextflow 코드에서 자주 볼 수 있습니다.
그 자체로는 아무것도 하지 않으므로 일반 괄호가 아닌 클로저가 필요하며 수행할 작업을 지정해야 합니다. CSV에서 행을 받으므로 논리적인 변수 이름인 "row" 를 사용합니다. 이것이 입력이며 해당 배열의 첫 번째 요소만 반환하고 싶습니다.
Nextflow의 배열은 0부터 시작하므로 첫 번째 요소는 row[0]입니다. 두 번째 열이라면 1, 세 번째 열이라면 2가 됩니다. 원하는 것을 반환할 수 있지만, 첫 번째 값만 반환합니다.
파이프라인을 다시 실행하여 예상대로 동작하는지 확인합니다.
splitCsv 후에 배열이 있고, map 후에는 깔끔한 문자열인 "Hello", "Bonjour", "Holà" 가 있습니다. 파이프라인이 이제 원하는 대로 동작합니다.
이제 view 명령들을 모두 제거합니다. 더 이상 필요하지 않습니다.
요약¶
디버깅을 마쳤고 최종 코드가 완성되었습니다. Path 로 분류된 input 이라는 CLI 매개변수를 받아 Nextflow가 경로를 찾고 로드하여 CSV 파일을 이해합니다. 모든 행을 반환하고 각 행의 첫 번째 요소만 채널에 매핑하여 채널 내용을 구성하고 프로세스에 전달합니다.
프로세스는 채널의 각 요소(총 세 개)에 대해 실행되어 세 개의 작업을 생성합니다. 그 결과는 워크플로우에서 게시되고, 프로세스 출력에서 수집되어 "hello_channels" 라는 하위 디렉토리에 저장됩니다.
실제 분석에 사용할 수 있는 실제 Nextflow 파이프라인에 점점 더 가까워지고 있습니다.
핵심 정리¶
이제 Nextflow 채널과 연산자가 무엇인지, 연산자가 채널에서 어떻게 작동하는지, 채널을 어떻게 생성하는지에 대한 감을 잡으셨기를 바랍니다.
이 동영상 시작 부분에서 말했듯이 채널은 Nextflow의 접착제입니다. 다양한 입력을 받아 조작하고 데이터를 가져와 다운스트림 워크플로우 로직에 전달할 수 있습니다.
워크플로우 블록은 모든 병렬 처리와 영리한 로직을 구축하고, Nextflow에 워크플로우 DAG를 구성하는 방법과 파이프라인을 조율하는 방법을 설명하는 곳입니다.
채널은 이해하기 쉬운 개념이 아닙니다. 잠시 휴식을 취하고 이에 대해 생각해 보고, 자료를 다시 읽어보며 이 개념들을 확실히 이해하세요. 이것이 Nextflow 이해의 핵심이며, 채널과 다양한 채널 연산자, 다양한 채널 팩토리를 더 잘 이해할수록 Nextflow 작성이 더 즐거워지고 파이프라인이 더 강력해집니다.
이것은 Python이나 다른 언어의 일반적인 프로그래밍과 다릅니다. 여기서는 if 문을 사용하지 않으며, 채널과 연산자를 사용하는 함수형 흐름 프로그래밍입니다. 다소 다르지만 매우 강력합니다.
이번 챕터가 끝났습니다. 잠시 휴식을 취하고 파트 3 동영상에서 만나겠습니다. 파트 3에서는 Hello Workflow를 다루며 워크플로우에 대해 더 자세히 이야기합니다.
이전 챕터와 마찬가지로 웹페이지 하단에 퀴즈 문제가 있으니, 빠르게 풀어보고 방금 다룬 자료의 다양한 부분을 이해했는지 확인하세요. 그 외에는 다음 동영상에서 만나겠습니다. 감사합니다.