Ana içeriğe geç

Bölüm 2: Hello Channels - Video Transkripti

Yapay zeka destekli çeviri - daha fazla bilgi ve iyileştirme önerileri

Önemli notlar

Bu sayfa yalnızca transkripti göstermektedir. Adım adım talimatların tamamı için eğitim materyaline geri dönün.

Transkriptte gösterilen bölüm numaraları yalnızca bilgilendirme amaçlıdır ve materyallerdeki tüm bölüm numaralarını içermeyebilir.

Hoş Geldiniz

Merhaba ve Hello Nextflow'un 2. Bölümüne tekrar hoş geldiniz. Bu bölümün adı Hello Channels.

Kanallar, Nextflow boru hattınızdaki yapıştırıcı gibidir. Nextflow'un tüm bilgileri aktarmak ve iş akışınızı düzenlemek için kullandığı, tüm farklı süreçleri bir arada tutan parçalardır.

Kanalların bir başka bölümü de operatörlerdir. Bunlar temelde kanallarda içerikleri değiştirmek için kullanabileceğimiz fonksiyonlardır. Hadi VS Code'a dalıp nerede olduğumuza bakalım.

Bu VS Code'da çok yakınlaştırdım, bu yüzden işleri temiz ve düzenli tutmak için tüm .nextflow* dosyalarını ve work/ dizinini, results/ dizinini ve Birinci Bölüm'den her şeyi kaldırdım. Ve burada yeni baştan başlıyorum. Ama bunun için çok endişelenmeyin. İstemiyorsanız, bu dosyaları orada bırakabilirsiniz. Herhangi bir soruna neden olmazlar.

Bu bölüm için hello-channels.nf üzerinde çalışmaya başlayacağız ve bunu açarsam, daha önce üzerinde çalıştığımız dosyaya çok benzer görünmeli. Farklı bölümlerin betiğin farklı yerlerinde olması mümkün, ancak her şey temelde aynı olmalı.

Farklı olan bir şey, output bloğundaki yolun artık bu bölüm için hello_channels olması, bu da sonuç dosyalarının results dizininde farklı bir alt dizinde saklanacağı anlamına geliyor. Eğer hala orada varsa, çıktılar hakkında kafanız karışmadan başlamak için güzel ve temiz bir yer olmalı.

Tamam, bu iş akışını çalıştırdığımızda bu betiğin ne yaptığını hızlıca hatırlayalım. "nextflow run hello-channels.nf" yapıyoruz. "--input myinput" yapabiliriz ve bunu çalıştırdığımızda, yukarıdaki sayHello sürecine giren, greeting'e giden ve output.txt'ye kaydedilen bu params.input parametresini kullanacak. Ve bunu results dosyasında görebiliriz. Harika.

1. Değişken girdileri açıkça bir kanal aracılığıyla sağlayın

Bu güzel. Ama oldukça basit. Bu parametrede bir kez çalışan bir sürece giden bir değişkenimiz var ve gerçekten ölçeklenmiyor. Ve burada oluşturmak için ona birçok farklı dosya veremiyoruz. Ona birçok farklı selamlama veremiyoruz. Sadece bir tane var.

Gerçekte, Nextflow tamamen analizinizi ölçeklendirmekle ilgilidir. Bu yüzden muhtemelen birden fazla şey yapmasını istersiniz. Ve bunu kanallarla yapıyoruz.

Kanallar, Nextflow'u öğrenen birçok kişi için biraz benzersiz bir kavramdır. Fonksiyonel programlama kavramlarından gelir ve kafanızda oturması biraz zaman alabilir, ancak bir kez anladığınızda, Nextflow'un gücünü gerçekten açığa çıkarırlar ve iş akışlarınızı nasıl yazacağınızın anahtarıdır.

1.1. Bir girdi kanalı oluşturun

Bu betiği alıp sadece bir param yerine bir kanal kullanmasını sağlayarak başlayalım.

İşleri bir araya getirme konusundaki tüm iş akışı mantığımızın bulunduğu workflow'a gidiyoruz. Ve buraya gireceğim ve yeni bir kanal oluşturacağım.

Yeni bir kanal oluşturun.

Ve buna "greeting_ch" diyeceğim. Bu değişkenin bir kanal olduğunu hatırlayabilmeniz için "_ch" yapmak bir gelenektir. Ama istediğiniz gibi adlandırabilirsiniz.

Ve sonra eşittir diyeceğim ve "channel.of" yapacağım.

Channel, kanallarla ilgili her şey için ad alanı gibidir. Daha önce Nextflow kullanıyorsanız küçük "c" harfi. Ve ".of", kanal oluşturmanın temel olarak bir yolu olan Channel factory denen bir şeydir.

Birçok farklı kanal fabrikası var. Burada sadece "." yaparsam, VS Code'un bir sürü öneri yaptığını görebilirsiniz, ancak ".of" en basit olanıdır ve sadece burada bir girdi alır.

Parantez yapabilirim ve "Hello Channels!" diyeceğim.

Harika. Bir kanalım var. Fantastik. Kaydet'e basabilirim, tekrar çalıştırabilirim, ama ilginç bir şey olmayacak. VS Code burada bana turuncu bir uyarı çizgisi verdi ve bunun ayarlandığını söyledi: bunu oluşturdunuz, ama aslında hiçbir şey için kullanmadınız. Bu kanal tüketilmiyor.

Tamam, peki bunu nasıl kullanırız? Çok basit. Bunu alacağım, kopyalayacağım ve params.input'u sileceğim ve yerine "greeting_ch" koyacağım. Yani bu kanalı sayHello'ya girdi olarak geçireceğiz.

Şimdilik bu string'i sabit kodladığımı unutmayın. Bu, son bölümün sonunda kullandığımız güzel parametreden sonra biraz geri adım, ama mantığı görebilmeniz için işleri basit tutuyor.

Tamam, terminalime gideceğim ve iş akışını tekrar çalıştıracağım. Bu sefer herhangi bir "--input" olmadan, ve çalışacak ve oluşturduğumuz bu kanalı kullanacak ve umarım results/hello_channels/ içinde bir dosyamız olmalı ve şimdi "Hello Channels!" diyor. Fantastik. Yani kanalımızdan beklediğimiz bu. Harika.

1.4. Kanal içeriğini incelemek için view() kullanın

Burada eklenecek bir şey daha var, kanallarda kullanabileceğimiz ".view" adlı başka bir fonksiyona hızlı bir giriş.

Bu, Python'daki print komutuna veya alışık olabileceğiniz diğer dillere benzerdir ve çalıştırdığımızda bu kanalın içeriğini terminale döker.

".view" yapın, ve sonra iş akışını tekrar çalıştırırsam, oluşturduğumuz anda bu kanalın içeriğinin ne olduğunu terminale yazdırmalı.

Nitekim, terminale burada yazdırıldığını görebilirsiniz. "Hello Channels!".

İsterseniz bunları satırlar arasında bölebileceğinizi unutmayın ve aslında Nextflow otomatik biçimlendiricisi bunu sizin için yapmaya çalışacaktır. Boşluk burada gerçekten önemli değil, bu yüzden bunları birbiri ardına zincirleyebilirsiniz.

2. İş akışını birden fazla girdi değeri üzerinde çalışacak şekilde değiştirin

Tamam, kanalımızda güzel olan bir şey var, ama temelde daha öncekiyle aynı. O halde biraz daha karmaşık hale getirelim. Kanalımıza birkaç şey daha ekleyelim.

".of()" kanal fabrikası birden fazla öğe alabilir, o halde birkaç tane daha yazalım. Hello, Bonjour, Hej yapacağız. Ve sonra bu iş akışını tekrar çalıştırabiliriz ve ne olacağını göreceğiz.

Tekrar çalışmalı. Ve şimdi yazdırdık. View ifademizle terminale "Hello", "Bonjour" ve "Hej". Fantastik.

2.1.2. Komutu çalıştırın ve log çıktısına bakın

Bu noktada işimizin bittiğini düşünebilirsiniz. Ama aslında burada bizi tökezletecek küçük bir tuzak var. Çıktı dosyamıza bakarsak. Görebilirsiniz ki içinde "Hello" var, ama diğer çıktılardan hiçbiri yok. Aslında, sadece bu.

Bu iş akışını birden çok kez çalıştırırsak, bazen "Bonjour" olduğunu, bazen "Hej" olduğunu bile görebiliriz. Biraz rastgele.

Terminale bakarsak, üç kez çalıştığını ve farklı view çıktılarını görebiliriz. Ama work dizinine gidersem, "cat work" yapabilirim. Bu hash'i koyun ve genişletin ve output.txt. Work dizinindeki bu dosyanın results dizininden farklı olduğunu görebilirsiniz ve bu "Hej". Yani burada tam olarak çalışmayan bir şey var.

Ve anahtar şu ki, çalışan üç görevimiz var. Nextflow çıktısı, tüm terminalinizi tamamen ele geçirmemesi için işlem devam ederken bunu özetlemeye çalışır ve bu ANSI Logging, ANSI kaçış kodlarını kullanır, temelde diğer görevlerin üzerine yazmıştır. Bu yüzden size güncellenen son olanı gösterir.

2.1.3. Komutu -ansi-log false seçeneğiyle tekrar çalıştırın

Bunu gerçekten daha iyi anlamak için yapabileceğimiz birkaç şey var. Work dizininin kendisine bakabiliriz ve oradaki tüm farklı work dizinlerini görebilirsiniz, ama bu biraz kafa karıştırıcı çünkü farklı Nextflow yürütme çalıştırmalarıyla karışacak.

Veya Nextflow'a ANSI kaçış kodlarını kullanmamasını söyleyebiliriz.

Komutu tekrar çalıştırırsam, ama bu sefer "-ansi-log false" dersem kapatmak için, $NO_COLOR veya "$NXF_ANSI_LOG=false" ortam değişkenlerini de kullanabilirim. O zaman bu kaçış kodları olmadan Nextflow'un daha eski tarz günlüğünü kullanır. Hiçbir akıllı güncelleme olmadan doğrudan terminale yazdırır.

Ve şimdi çalışan bu üç sürecin tamamını görebiliriz. Ve her birinin kendi görev hash'i var. Ve bu work dizinlerine girersek, belirttiğimiz üç farklı selamlamayı göreceğiz.

Bu artık biraz daha mantıklı. Umarım Nextflow'un bunu yaptığını anlıyorsunuzdur, sadece bu work dizinleriyle terminalde size gösterdiği konuda biraz akıllıydı.

Ancak, bu work dizinleriyle ilgili bir sorunu çözdü, ama çıktı dosyasıyla ilgili bir sorunu çözmedi. Hala sadece "Hello" yazan bir çıktı dosyamız var.

2.2. Çıktı dosya adlarının benzersiz olacağından emin olun

Şimdi bunu anlamak için iş akışı betiğimize geri dönmemiz gerekiyor. Kanalımızı burada oluşturuyoruz, sürecimize geçiriyoruz ve sürece bakarsak, selamlamayı "output.txt" adlı bir dosyaya yazıyoruz ve bu çıktı dosyasını çıktı bloğuna geri geçiriyoruz, yayınlıyoruz.

Ancak, bu süreç bu üç farklı görevi üç kez çalıştırır. Hepsi "output.txt" adlı bir dosya oluşturur, tüm bu çıktı dosyaları results dizinine yayınlanır ve hepsi birbirinin üzerine yazar. Yani orada aldığınız sonuç dosyası her neyse, sadece oluşturulan son dosyadır, ama diğerlerinin hepsini silmiştir. Bu gerçekten istediğimiz şey değil.

2.2.1. Dinamik bir çıktı dosya adı oluşturun

Bunu ele almanın farklı yolları var, ama şimdilik en basiti sadece farklı benzersiz dosya adları oluşturmak. Böylece görev her farklı selamlama ile çalıştığında, farklı bir çıktı dosyası oluşturacak, bu da yayınlandığında artık çakışmayacak. Ve sonra üç benzersiz çıktı dosyası alacağız.

Bunu tamamen aynı şekilde yapıyoruz. Bu değişkeni script bloğu içinde herhangi bir yerde kullanabiliriz ve birden çok kez kullanabiliriz.

Buraya yapıştırabilirim, "${greeting}_output.txt", ve sonra bunu buraya da yapıştırmam gerekiyor çünkü artık output.txt adlı bir dosya oluşturmuyoruz. Yani bunu güncellemezsen, Nextflow hiç oluşturulmamış bir dosya beklediğini söyleyen bir hatayla çökecek.

Yani orada da aynısını yapmam gerekiyor ve bu değişkenin anlaşılması için tek tırnak değil çift tırnak kullanmam gerekiyor.

Tamam, deneyelim ve işe yarayıp yaramadığına bakalım. İş akışını tekrar çalıştıracağız. Umarım bize üç farklı work dizinindeki üç farklı görevi gösterecek. Ve nitekim, solda burada results klasöründe görebilirsiniz. Şimdi üç farklı dosya adıyla üç farklı dosyamız var ve her biri beklediğimiz farklı içeriklere sahip. Yani dosyalar artık birbirinin üzerine yazmıyor ve her şey beklediğimiz gibi orada.

Burada geçtiğimiz bu biraz önemsiz bir kurulum, ama dosya yayınlamanın nasıl çalıştığı hakkında anlamanız gereken bazı temel kavramların altını çiziyor ve tuzak olarak düşebileceğiniz bazı şeyler. Umarım bunu kendi iş akışlarınızda önleyebilirsiniz.

Burada yaptığımızın gerçek hayat durumlarında biraz pratik olmadığını da belirtmekte fayda var. Bazı girdi verilerini aldık ve bu veriyi kullanıyoruz, ama aynı zamanda dosyayı bu veriden sonra adlandırıyoruz, ki bunu genellikle yapamazsınız.

Yani gerçek daha olgun Nextflow boru hatlarında, genellikle belirli bir örnekle ilişkili tüm meta verileri içeren bir meta nesnesi geçirirsiniz. Daha sonra buna dayalı olarak dinamik dosya adları oluşturabilirsiniz, bu çok daha pratiktir.

Bunu en iyi uygulamalarla nasıl yapacağınızla ilgileniyorsanız, training.nextflow.io'da özellikle meta veriler ve meta haritalar hakkında bir yan görev var, daha fazla ayrıntı için oraya bakabilirsiniz.

3. Bir dizi aracılığıyla birden fazla girdi sağlayın

Tamam. Şimdi kanalların nasıl yapılandırıldığı ve kodlama dilindeki diğer veri yapılarından nasıl farklı olduğu hakkında biraz keşfedeceğiz. Ve diğer dillerden geldiyseniz tanıdık bir kavram olabilecek bir diziyi potansiyel olarak nasıl kullanabileceğimi düşüneceğim.

Bir kanalda bir dizi kullanabilir miyim? Deneyelim. Bir dizi oluşturacağım ve bunu dokümanlardan kopyaladım, "greetings_array" ve "Hello", "Bonjour" ve "Holà". Ve sonra bunu sabit kodlanmış string'lerimin yerine buraya koyacağım. Yani "channel.of" "greetings_array" diyeceğim, bu diziyi bir kanala geçireceğim. Deneyelim.

Terminali açın ve boru hattını çalıştırın.

Tamam. View ifadesinin burada beklediğimiz gibi dizimizi yazdırdığını görebilirsiniz, ama sonra tüm bu kırmızı metin, veya hala "-ansi-log" kapalıysa kırmızı olmayacak, ama tüm bu kırmızı metin bize bir şeylerin yanlış gittiğini söylüyor.

Artık burada güzel bir yeşil onay işaretimiz yok. Kırmızı bir çarpımız var ve bunu biraz daha geniş yaparsam okumak daha kolay olur, Nextflow bize neyin yanlış gittiğini söylüyor.

Bunu bölüm bölüm inceleyelim. Hatanın nedeni olduğunu söylüyor ve sonra hatanın nedeni, eksik çıktı dosyaları. Yani temelde o çıktı bloğu bu dosyanın oluşturulması gerektiğini söyledi ve oluşturulmadı. Sonra bu yürütülen komut olduğunu söylüyor. Yani bu temelde o .command.sh dosyasının içeriği. Tüm bu değişkenler konulduktan sonra nasıl göründüğü bu.

Ve burada echo komutumuzun aslında sadece bir kez çalıştırıldığını ve tüm diziyi kullandığını görebilirsiniz, ama bir string gösteriminde, ki bu gerçekten istediğimiz şey değildi.

Ve sonra komut böyle çıktı ve bu, dosyaları görmek ve biraz daha anlamak için gidebileceğimiz work diziniydi.

Tamam. O zaman olan şey şuydu. Nextflow bu tüm diziyi sürece tek bir kanal öğesi olarak geçirdi, bu da sürecin sadece bir kez çalıştığı anlamına geliyordu. Bir görevi vardı ve veriyi beklediğimiz yapıda kullanmadı.

3.2. Kanal içeriğini dönüştürmek için bir operatör kullanın

Bu yüzden kullanılmadan önce bu kanala bir şey yapmamız gerekiyor. Ve bu, kanal içeriğini manipüle etmek için kanallarda kullanabileceğimiz özel fonksiyonlar olan operatörleri kullanmak için sahneyi hazırlıyor.

Bu durumda, flatten adlı bir şey kullanacağız. Bunu burada kanalın sonuna geçiriyoruz. Yani kanalı oluşturuyoruz ve sonra flatten çalıştırıyoruz. Ve yine, üzerine gelirseniz, bu komut için belgeleri doğrudan VS Code'da gösterir, bu çok yardımcı. Tüm bu belgeleri Nextflow web sitesinde, dokümantasyonda da bulabilirsiniz.

Bu kodu şimdi çalıştırabilir ve işe yarayıp yaramadığını görebilirim, ama aynı zamanda operatörler içinde ve Nextflow kodu içinde dinamik kod yapmanın nasıl yapılacağını tanıtmak için güzel bir fırsat, bunlara closure denir.

Bu yüzden flatten çalıştırmadan önce buraya bir view komutu ekleyeceğim. Ve burada bu süslü parantezler var, bu dinamik closure. Ve burada sadece view operatörü bağlamında yürütülecek bazı rastgele kodlar var.

Burada, view operatörünün girdileri olan greeting'i al diyor ve bu burada. Buna istediğim gibi isim verebilirdim, buna "foo" diyebilirdim ve sadece daha sonra "foo" olarak ona atıfta bulunmam gerekir. Ve sonra bununla, bunu döndür diyorum.

Ve sonra bir değişken için flatten'dan önce yazan bir string döndürüyorum. çok basit.

Şimdi bunun tamamen aynısını ekleyeceğim, ama flatten'dan sonra diyeceğim.

Yani bunun yaptığı şey, bu sırayla çalıştığı için, flatten çalıştırmadan önce kanalın nasıl göründüğünü göreceksiniz ve sonra flatten çalıştırdıktan sonra tekrar.

Ve sonra bu greeting kanalı hala oluşturuldu, bu yüzden hala sürece geçirilecek. Ve umarım şimdi iş akışı çalışacak. Deneyelim.

Harika. İlk olarak, boru hattı bu sefer çökmedi. Düzgün çalışan üç sürecimiz vardı ve küçük bir onay işaretimiz var. Ve sonra view ifadelerimizin işe yaradığını görebiliriz.

flatten'dan önce var, bu daha önce başarısızlıktan gördüğümüz dizi, ve sonra flatten çağrıldıktan sonra üç kez var, "Hello", "Bonjour" ve dizideki diğer üç ayrı öğe var, bunlar şimdi umduğumuz gibi kanaldaki üç ayrı öğe.

Ve view operatörünün üç kez çalıştırıldığını görebilirsiniz. Ve bunun nedeni flatten'dan sonra bu kanalın artık üç öğesi olması. Ve bu yüzden operatör üç kez çağrılır.

Çok hızlı bir şekilde, daha önce kanal fabrikaları oluştururken "." yaptığımı söylemek isterim ve kanallar oluşturmanın birçok farklı yolu olduğunu gördük ve bunlardan biri "fromList" olarak adlandırılır. Ve bu aslında özellikle bu aynı işlemi yapmak için tasarlanmıştır. Yani sadece from list greetings away yapabilirdik ve bu işe yarayacaktır. Biraz daha temiz ve güzel bir sözdizimi. Ama bu gösterimin amaçları için, kanalın nasıl manipüle edildiğini ve farklı operatörlerin bir kanalın içeriğindeki içeriği nasıl değiştirebileceğini görebilmeniz için adım adım yapmak istedik.

4. Girdi değerlerini bir CSV dosyasından okuyun

Tamam, bunu biraz daha gerçekçi nasıl yapabiliriz? Muhtemelen Nextflow boru hattınızda sabit kodlanmış dizilerle çok fazla kod oluşturmak istemeyeceksiniz. Muhtemelen başlattığınızda veriyi dışarıdan almak isteyeceksiniz ve bu veri neredeyse kesinlikle dosyalarda olacak.

Yani yapacağımız bir sonraki şey, bunu çoğaltacağız, ama veriyi tek bir CLI parametresinden veya sabit kodlanmış bir string veya diziden almak yerine, bir dosyadan alacağız.

Greetings away'imizden kurtulalım. Ve şimdi bu kanal fabrikasını tekrar değiştireceğiz. Seçebileceğiniz bir sürü olduğunu söyledim ve ".fromPath" adlı bir tane var. Ve ona söyleyeceğim, bu durumda, daha önce kullandığımız girdimiz olan params.input'u alsın.

Şimdi bu parametre henüz kullanılmaya hazır değil. Hala bunun bir string olduğunu söylüyoruz ve burada bir varsayılanla sabit kodlanmış, ama bu string'i üzerine yazabiliriz. Şimdi bunun yerine bir dosya olmasını istiyoruz. Yani tür farklı. Artık bir String değil. Bir Path.

Ve sonra istediğimiz takdirde varsayılanı yine bir Path'e ayarlayabiliriz. Ve soldaki explore'a bakarsam, bu depoda, bu çalışma dizininde, data adlı bir dizinimin olduğunu görebilirsiniz. Orada "greetings.csv" adlı bir dosyam var.

Yani varsayılanı burada "data/greetings.csv" olarak ayarlayabilirim. Şimdi, bu boru hattını herhangi bir komut satırı seçeneği olmadan tekrar çalıştırdığımda, bu varsayılan değeri kullanacak. Bunun bir path olduğunu biliyor, bu yüzden bunu bir string değil bir path olarak ele alması gerektiğini biliyor.

Ve sonra bunu bu params.input'tan bir kanal fabrikasına geçirecek ve kanalımızı oluşturacak, bu daha sonra sayHello adlı bu süreçte kullanılacak. Deneyelim.

Tamam. Başarısız oldu. Endişelenmeyin. Bu bekleniyordu. Ve eğitim materyalini takip ediyorsanız, orada da beklendiğini göreceksiniz. Burada ne oluyor bakalım.

Boru hattını çalıştırmaya çalıştı. Süreci yürütmeye çalıştı ve daha önce gördüğümüze oldukça benzer bir hata aldı.

Burada diyor ki: _echo çalıştırmaya çalıştık, _ama bu CSV dosyasının içeriğini yankılamak yerine, sadece yolu yankıladı. Ve görebilirsiniz ki bu CSV dosyasına tam mutlak yol burada.

Ve sonra nitekim, bunu bu gerçekten karmaşık yola yazmaya çalıştığı için, gerçekten ne yapacağını bilmedi. Ve süreç work dizininin kapsamı dışındaydı.

Başlangıçta Nextflow'un her yürütülen görevi özel bir work dizini içinde kapsüllediğini söylemiştim. Ve bu work dizininin dışında olan verilere yazmaya çalışırsanız, Nextflow sizi bir güvenlik önlemi olarak durduracaktır. Ve burada olan da bu. Mutlak bir yola yazmaya çalıştık ve Nextflow başarısız oldu ve bizi engelledi.

4.2. Dosyayı ayrıştırmak için splitCsv() operatörünü kullanın

Tamam, bu kanala bir bakalım ve nasıl göründüğünü görelim. ".view" yapabiliriz ve bunu web sitesinden kopyaladım. Yani .view, ve burada dinamik bir closure'ımız var ve girdi olarak "csv" değişken adını söylüyoruz. Yani bu kanal içeriği ve splitCsv'den önce diyoruz ve nasıl göründüğü bu.

Tekrar çalıştırırsam, yine başarısız olacak, ama bu kanalın içinde ne olduğunu bize gösterecek. Özellikle heyecan verici değil. O path değişkeni. Yani görebilirsiniz ki terminale yazdırıldığı için burada sadece bir string, ama bu dosya hakkındaki bilgileri ve meta verileri içeren bir path nesnesi.

Dosyanın meta verilerini girdiye geçirmek istemiyoruz. O dosyanın içeriğini geçirmek istiyoruz. greetings.csv dosyasına bakarsak, burada bu farklı değişkenlerin olduğunu görebilirsiniz. Yine Hello, Bonjour, Holà. Ve bunlar gerçekten sürece geçirmek istediğimiz şeyler, sadece dosyanın kendisi tek bir nesne olarak değil.

Bu yüzden bu CSV dosyasını ayrıştırmamız gerekiyor. Onu açmamız, CSV dosyasının içeriğine ulaşmamız ve sonra içerikleri kanal içinde sürece geçirmemiz gerekiyor.

Log mesajından muhtemelen anlayabilirsiniz, başka bir operatör, başka bir kanal operatörü olan splitCsv'yi kullanmak istiyoruz. Yani "dot" "s" yaparsam, ve sonra otomatik önerildiğini görebilirsiniz. Oops, splitCsv ve bazı parantezler.

Ve sonra splitCsv'den sonra, nasıl göründüğünü görebilmemiz için başka bir view ifadesi koyacağım. Boru hattını çalıştıralım ve ne elde ettiğimize bakalım.

Tamam. Hala başarısız oldu, ama yeni ve heyecan verici bir şekilde, bu ilerleme.

Bu sefer yine betiğimizle ilgili bir sorunumuz var, bu render edildi. Şimdi. Artık son yolu almadık, ama bir değişkenler dizisi aldık, bu da daha önce bir diziyi sabit girdi olarak geçirdiğimizde aldığımız hataya çok benziyor.

View operatöründen gelen günlüğümüzle, splitCsv'den önce yolun olduğunu görebiliriz. Ve nitekim, splitCsv'den sonra, üç farklı çıktımız var ve bu çıktıların her biri greetings.csv dosyasındaki satırların her birine çok benziyor, bu mantıklı.

Yani burada olan şey, Nextflow'un bu CSV dosyasını ayrıştırması, bize CSV dosyasının her satırı için bir dizi olmak üzere üç nesne vermesi. Yani sonra üç kez tek bir string değeri yerine kanala bir değişkenler dizisi geçirdik.

Tamam, geçen sefer bu sorunumuz olduğunda, flatten kullandık. Hadi çok hızlı bir şekilde. Flatten'ı deneyelim ve ne olacağını görelim.

Bu değişkenleri ne olursa olsun çağırabilirim. Yani buna myarray diyeceğim çünkü artık gerçekten bir CSV değil. Tekrar çalıştırmayı deneyelim ve flatten ile ne olacağını görelim.

Yani bu sefer çalışacağız, CSV'yi üç dizi nesnesine ayrıştırdık ve sonra düzleştirdik. Ve bu sefer geçti. Ve Nextflow boru hattı çalıştı. Ancak flatten'ın gerçekten işe koyulduğunu ve her şeyi düzleştirdiğini görebilirsiniz. Ve böylece her satır için üç bağımsız dizi girişi alıyoruz. Ve bu yüzden süreci her CSV satırı için üç kez çalıştırdı. Ve şimdi bir sürü sonuç dosyamız var, ve 123, 456 ve her türlü şey, sadece gerçekten istediğimiz CSV'nin ilk sütunu değil.

4.3. Selamlamaları çıkarmak için map() operatörünü kullanın

Peki sadece ilk sütuna nasıl ulaşırız? Flatten burada çok basitse, aslında özelleştirebileceğimiz ve CSV'den ne istediğimizi söyleyebileceğimiz daha karmaşık bir operatöre ihtiyacımız var.

Bunu yapmak için map kullanacağız. Temelde map sadece diyor ki, bana verilen her öğe üzerinde bir kod, bir fonksiyon çalıştır ve üzerinde bir tür dönüşüm yap. Ve çok esnek olduğu için, Nextflow kodunda her zaman karşınıza çıktığını göreceksiniz.

Kendi başına hiçbir şey yapmaz. Yani normal parantez istemiyoruz, burada bir closure istiyoruz ve ne yapacağını söylememiz gerekiyor. Yani "row" diyeceğim, çünkü CSV'den satırlar veriliyor, bu yüzden mantıklı bir değişken adı. Girdi. Ve sadece o dizinin ilk öğesini döndürmek istiyorum.

Nextflow'daki diziler sıfır tabanlıdır, bu yüzden sadece ilk öğe olduğunu söyleyeceğiz, bu sıfır satırı. İkinci sütunu isteseydik, bir veya üçüncü sütun iki olabilir, ve böyle devam eder. Burada istediğimizi döndürebiliriz, ama sadece ilk değeri döndüreceğim.

Ve şimdi, boru hattını tekrar çalıştırabiliriz ve beklediğimizi yapıp yapmadığını görebiliriz.

Nitekim, splitCsv'den sonra dizilerimiz var ve sonra map'ten sonra güzel temiz string'lerimiz var, sadece "Hello", "Bonjour" ve "Holà". Ve boru hattı şimdi istediğimizi yapıyor. Fantastik.

Artık tüm bu view komutlarından kurtulabiliriz. Artık onlara ihtiyacımız yok.

Özet

Hata ayıklamamızı bitirdik ve sonunda elde ettiğimiz kod bu. input adlı CLI parametremizi alıyoruz, bu bir Path olarak sınıflandırılmış. Nextflow yolu bulur, yükler ve CSV dosyasını anlar. Tüm farklı satırları döndürür. Ve sonra o satırın sadece ilk öğesini kanala eşleriz, bu bize kanal içeriğini veren bir tür, bu sürece geçirilir.

Ve süreç kanaldaki her öğe üzerinde çalışır, bu üç. Ve süreci üç kez çalıştırır, ona üç görev verir. Ve bu sonuçlar daha sonra iş akışından yayınlanır, süreç çıktısı tarafından alınır. Bir iş akışından yayınlanır ve çıktı bloğunda "hello_channels" adlı bir alt dizine kaydedilir.

Oldukça havalı. Şimdi gerçek bir analiz için çalıştırabileceğiniz gerçek hayattaki bir Nextflow boru hattına daha yakın bir şeye ulaşıyoruz.

Özet

Tamam. Umarım şimdi Nextflow kanallarının ve operatörlerin ne olduğu ve operatörlerin kanallarda nasıl çalıştığı ve bunları nasıl oluşturabileceğiniz hakkında bir fikir ediniyorsunuzdur.

Kanallar, bu videonun başında söylediğim gibi, Nextflow'un yapıştırıcısıdır. Ve burada farklı girdiler alabileceğimizi ve bunları manipüle edebileceğimizi ve bu veriyi alıp sonra aşağı akış iş akışı mantığına geçirebileceğimizi görebilirsiniz.

Ve buradaki bu workflow bloğu gerçekten tüm o paralelleştirmeyi ve tüm akıllı mantığı oluşturduğunuz ve Nextflow'a iş akışı DAG'ınızı nasıl oluşturacağını ve boru hattınızı nasıl düzenleyeceğini açıkladığınız yerdir.

Kanallar kafanızda oturması en kolay kavram değil. Bu yüzden bir mola verin, bunun hakkında biraz düşünün, belki materyali tekrar okuyun ve bu kavramları gerçekten anladığınızdan emin olun çünkü bu Nextflow anlayışınızın anahtarıdır ve kanalları ve farklı kanal operatörlerini ve farklı kanal fabrikalarını ne kadar iyi anlarsanız. Nextflow yazarken o kadar çok eğleneceksiniz ve boru hatlarınız o kadar güçlü olacak.

Bu, Python'daki veya diğer dillerdeki normal programlama ile aynı değil. Burada if ifadeleri kullanmıyoruz, bu kanallar ve operatörler kullanarak fonksiyonel akış programlamadır. Yani biraz farklı, ama aynı zamanda süper güçlü.

Bu bölümün sonu. Gidin hızlı bir mola verin ve bir sonraki videoda sizi göreceğim, üçüncü bölüm için Hello Workflow'dan geçeceğiz ve iş akışları hakkında biraz daha konuşacağız.

Önceki bölüm gibi, burada web sayfasının altında birkaç sınav sorusu var, bu yüzden bunları hızlıca gözden geçirebilir ve az önce yaptığımız materyalin tüm farklı bölümlerini anladığınızdan emin olabilirsiniz. Ve bunun dışında, sizi bir sonraki videoda göreceğim. Çok teşekkür ederim.

Tamam.