Parte 2: Hello Channels - Transcripción del Video¶
Traducción asistida por IA - más información y sugerencias de mejora
Notas importantes
Esta página muestra únicamente la transcripción. Para instrucciones completas paso a paso, regrese al material del curso.
Los números de sección mostrados en la transcripción se proporcionan solo con fines indicativos y pueden no incluir todos los números de sección de los materiales.
Bienvenida¶
Hola y bienvenido/a de vuelta a la Parte 2 de Hello Nextflow. Este capítulo se llama Hello Channels.
Los canales son como el pegamento en tu pipeline de Nextflow. Son las piezas que mantienen juntos todos los diferentes procesos, que Nextflow usa para pasar toda la información y orquestar tu workflow.
Hay otra parte de los canales que son los operadores. Estos son básicamente funciones que podemos usar en los canales para modificar el contenido. Vamos a sumergirnos en VS Code y ver dónde estamos.
Tengo mucho zoom en este VS Code, así que para mantener las cosas limpias y ordenadas, he eliminado todos los archivos .nextflow* y el directorio work/ y el results/ y todo del Capítulo Uno. Y solo estoy comenzando de nuevo aquí. Pero no te preocupes mucho por eso. Si no quieres, puedes dejar esos archivos. No causarán ningún problema.
Vamos a comenzar trabajando en hello-channels.nf para este capítulo, y si abro esto, debería verse muy similar al archivo en el que estábamos trabajando anteriormente. Puede ser que diferentes partes estén en diferentes lugares del script, pero todo debería ser básicamente lo mismo.
Una cosa que es diferente es que la ruta en el bloque output aquí ahora es hello_channels para esta parte, lo que significa que los archivos de resultado se almacenarán en un subdirectorio diferente en tus resultados si todavía tienes eso allí. Así que debería ser un lugar agradable y limpio para comenzar sin confundirse con las salidas.
Bien, entonces recordemos rápidamente qué hace este script cuando ejecutamos este workflow. Hacemos "nextflow run hello-channels.nf". Podemos hacer "--input myinput", y cuando ejecutamos esto, va a usar este parámetro, params.input, que se pasó como la variable para el proceso sayHello aquí arriba, que va a greeting y se guarda en output.txt. Y podemos ver eso en el archivo de resultados. Genial.
1. Proporcionar entradas variables a través de un canal explícitamente¶
Eso está bien. Pero es bastante simplista. Tenemos una variable en este parámetro, que va a un proceso que se ejecuta una vez, y realmente no escala. Y no podemos darle muchos archivos diferentes para crear aquí. No podemos darle muchos saludos diferentes. Solo tenemos uno.
En realidad, Nextflow se trata de escalar tu análisis. Así que probablemente quieras que haga más de una cosa. Y hacemos eso con canales.
Los canales son un concepto único para muchas personas que se inician en Nextflow. Proviene de estos conceptos de programación funcional, y puede tomar un poco de tiempo entenderlo, pero una vez que lo comprendes, realmente desbloquean el poder de Nextflow y es clave para cómo escribes tus workflows.
1.1. Crear un canal de entrada¶
Comencemos tomando este script y haciendo que use un canal en lugar de solo un param.
Vamos al workflow, que es donde está toda nuestra lógica de workflow para unir las cosas. Y voy a entrar aquí y voy a crear un nuevo canal.
Crear un nuevo canal.
Y voy a llamarlo "greeting_ch". Esta es una convención de hacer "_ch" así, solo para que puedas recordar que esta variable es un canal. Pero puedes llamarlo como quieras.
Y luego voy a decir igual, y voy a hacer "channel.of".
Channel es como el espacio de nombres para todo lo relacionado con canales. "c" minúscula si has estado usando Nextflow antes. Y el ".of" es algo llamado una fábrica de canales, que es básicamente una forma de crear un canal.
Hay muchas fábricas de canales diferentes. Si solo hago "." aquí, puedes ver que VS Code está sugiriendo muchos de ellos, pero ".of" es el más simple y solo toma una entrada aquí.
Así que puedo poner unos paréntesis y voy a decir "Hello Channels!".
Genial. Tengo un canal. Fantástico. Puedo guardar, podría ejecutarlo de nuevo, pero no va a pasar nada interesante. VS Code me ha dado una línea de advertencia naranja aquí y me ha dicho que esto está configurado: lo has creado, pero nunca lo has usado para nada. Este canal no se está consumiendo.
Bien, entonces ¿cómo lo usamos? Muy simple. Voy a tomar esto, copiarlo, y voy a eliminar params.input y voy a poner "greeting_ch" aquí en su lugar. Así que vamos a pasar este canal como entrada a sayHello.
Ten en cuenta que he codificado esta cadena por ahora. Esto es un poco un paso atrás después de nuestro bonito parámetro que usamos al final del último capítulo, pero solo mantiene las cosas simples para comenzar para que puedas ver la lógica.
Bien, voy a ir a mi terminal y voy a ejecutar el workflow de nuevo. Sin ningún "--input" esta vez, y se va a ejecutar y va a usar ese canal que hemos creado y con suerte deberíamos tener un archivo aquí arriba en results/hello_channels/ y ahora dice "Hello Channels!". Fantástico. Eso es lo que esperábamos, de nuestro canal aquí. Genial.
1.4. Usar view() para inspeccionar el contenido del canal¶
Una cosa más para agregar aquí, solo una introducción rápida a otra función que podemos usar en los canales llamada ".view".
Esto es análogo al comando print en Python u otros lenguajes que podrías conocer, y simplemente vuelca el contenido de este canal a la terminal cuando lo ejecutamos.
Así que hago ".view", y luego si vuelvo a ejecutar el workflow, debería imprimir en la terminal cuál es el contenido de ese canal, en el momento en que lo creamos.
Efectivamente, puedes ver que está impreso en la terminal aquí. "Hello Channels!".
Ten en cuenta que puedes dividir estas cosas en líneas si quieres, y de hecho, el formateador automático de Nextflow intentará hacer eso por ti. El espacio en blanco no es realmente importante aquí, así que puedes encadenar estas cosas una tras otra.
2. Modificar el workflow para ejecutarse con múltiples valores de entrada¶
Bien, entonces nuestro canal tiene una cosa, lo cual es agradable, pero es básicamente lo mismo que antes. Así que hagámoslo un poco más complicado. Agreguemos algunas cosas más a nuestro canal.
La fábrica de canales ".of()" puede tomar múltiples elementos, así que escribamos algunos más. Haremos Hello, Bonjour, Hej. Y luego podemos ejecutar este workflow de nuevo y veremos qué sucede.
Debería ejecutarse de nuevo. Y ahora hemos impreso. "Hello", "Bonjour" y "Hej" a la terminal con nuestra declaración view. Fantástico.
2.1.2. Ejecutar el comando y ver la salida del registro¶
Podrías pensar que terminamos en este punto. Pero en realidad hay un problema aquí, que nos va a tropezar. Si miramos nuestro archivo de salida aquí. Puedes ver que tiene "Hello" adentro, pero no tiene ninguna de las otras salidas. De hecho, es solo esta.
Si ejecutamos este workflow múltiples veces, incluso podríamos ver que a veces tiene "Bonjour", a veces tiene "Hej". Es un poco aleatorio.
Si miramos la terminal, podemos ver que se ejecutó tres veces y podemos ver las diferentes salidas de view. Pero si voy al directorio work, puedo hacer "cat work". Poner este hash y expandir eso y output.txt. Puedes ver que este archivo en el directorio work es diferente al directorio results, y este es "Hej". Así que hay algo que no está funcionando bien aquí.
Y la clave es que, tenemos tres tareas que se ejecutaron. La salida de Nextflow intenta resumir eso a medida que avanza el procesamiento, de modo que no se apodere completamente de toda tu terminal, y ese registro ANSI usa códigos de escape ANSI, básicamente ha sobrescrito las otras tareas. Así que solo te muestra la última que pasó a actualizarse.
2.1.3. Ejecutar el comando de nuevo con la opción -ansi-log false¶
Hay algunas cosas que podemos hacer para realmente entender esto un poco mejor. Podemos mirar en el directorio work mismo y puedes ver todos los diferentes directorios work allí, pero eso es un poco confuso porque se mezclará con diferentes ejecuciones de Nextflow.
O podemos decirle a Nextflow que no use los códigos de escape ANSI.
Así que si ejecuto el comando de nuevo, pero esta vez digo "-ansi-log false" para apagarlo, también podría usar las variables de entorno $NO_COLOR o "$NXF_ANSI_LOG=false". Entonces usa el tipo de estilo de registro de Nextflow más anticuado sin ninguno de estos códigos de escape. Simplemente imprime directamente a una terminal sin actualizaciones inteligentes.
Y ahora podemos ver los tres de estos procesos que se ejecutaron. Y cada uno de ellos su propio hash de tarea. Y si entramos en estos directorios work, veremos los tres diferentes saludos que especificamos.
Así que eso tiene un poco más de sentido ahora. Con suerte entiendes que Nextflow estaba haciendo esto, solo estaba siendo un poco inteligente con lo que te mostraba en la terminal con esos directorios work.
Sin embargo, esto se ha corregido para un problema con los directorios work, pero no ha corregido un problema con el archivo de salida. Todavía solo tenemos un archivo de salida que dice "Hello".
2.2. Asegurar que los nombres de archivo de salida serán únicos¶
Ahora para entender esto, necesitamos volver a nuestro script de workflow. Estamos generando nuestro canal aquí, lo estamos pasando a nuestro proceso, y si miramos el proceso, estamos escribiendo el saludo en un archivo llamado "output.txt" y pasando ese archivo de salida de vuelta al bloque output aquí abajo, publicándolo.
Sin embargo, cada tres veces que este proceso ejecuta estas tres tareas diferentes. Todas generan un archivo llamado "output.txt", todos esos archivos de salida se publican en el directorio results, y todos se sobrescriben entre sí. Así que cualquier archivo de resultado que obtengas allí es solo el último que se generó, pero destruyó todos los demás. Eso no es realmente lo que queremos.
2.2.1. Construir un nombre de archivo de salida dinámico¶
Hay diferentes formas de manejar esto, pero la más simple por ahora es simplemente crear diferentes nombres de archivo únicos. Así que cada vez que la tarea se ejecute con un saludo diferente, generará un archivo de salida diferente, que ya no chocará cuando se publique. Y entonces obtendremos tres archivos de salida únicos.
Hacemos esto exactamente de la misma manera. Podemos usar esta variable en cualquier lugar dentro del bloque script y podemos usarla múltiples veces.
Así que puedo pegarla aquí, "${greeting}_output.txt", y luego también necesito pegarla aquí arriba porque ya no estamos creando un archivo llamado output.txt. Así que si no actualizo esto, Nextflow fallará con un error diciendo que esperaba un archivo, que nunca fue generado.
Así que necesito hacer lo mismo allí y necesito usar comillas dobles, no comillas simples, para que esta variable se entienda.
Bien, probémoslo y veamos si funcionó. Vamos a ejecutar el workflow de nuevo. Con suerte nos mostrará las tres tareas diferentes dentro de los tres directorios work diferentes. Y efectivamente, puedes ver aquí arriba en la carpeta results aquí a la izquierda. Ahora tenemos tres archivos diferentes con tres nombres de archivo diferentes y cada uno con el contenido diferente que esperamos. Así que los archivos ya no se están sobrescribiendo entre sí, y todo está ahí como esperamos.
Esta es una configuración un poco trivial por la que hemos pasado aquí, pero subraya algunos de los conceptos clave que necesitas entender sobre cómo funciona la publicación de archivos, y algunas de las cosas en las que podrías caer como trampas. Así que con suerte puedes evitar eso en tus propios workflows.
También vale la pena señalar que lo que hemos hecho aquí es un poco poco práctico en situaciones de la vida real. Hemos tomado algunos datos de entrada y estamos usando esos datos, pero también estamos nombrando el archivo con esos datos, lo cual no puedes hacer usualmente.
Así que en pipelines de Nextflow más maduros y reales, a menudo pasarás un objeto meta con todos los metadatos asociados con una muestra dada. Luego puedes crear nombres de archivo dinámicos basados en eso, lo cual es mucho más práctico.
Si te interesa cómo hacer esto con las mejores prácticas, hay una búsqueda secundaria en training.nextflow.io, que trata específicamente sobre metadatos y mapas meta, así que puedes profundizar allí para más detalles.
3. Proporcionar múltiples entradas a través de un array¶
Bien. A continuación vamos a explorar un poco sobre cómo están estructurados los canales y cómo difieren de otros tipos de estructuras de datos en el lenguaje de codificación. Y voy a pensar un poco sobre cómo podría potencialmente usar un array, que podría ser un concepto familiar si vienes de otros lenguajes.
¿Puedo usar un array en un canal? Probémoslo. Voy a crear un array, y he copiado esto de la documentación, "greetings_array" y "Hello", "Bonjour" y "Holà". Y luego voy a poner eso aquí en lugar de mis cadenas codificadas. Así que voy a decir "channel.of" "greetings_array", pasando este array a un canal. Probémoslo.
Abrir la terminal, y ejecutar el pipeline.
Bien. Puedes ver que la declaración view aquí imprimió nuestro array como se esperaba, pero luego todo este texto rojo, o no será rojo si todavía tienes "-ansi-log" apagado, pero todo este texto rojo nos está diciendo que algo salió mal.
Ya no tenemos una marca verde bonita aquí. Tenemos una cruz roja, y si solo hago esto un poco más ancho para que sea más fácil de leer, Nextflow nos está diciendo qué salió mal.
Así que dividamos esto sección por sección. Dice que el error fue causado por, y luego la razón del error, que son archivos de salida faltantes. Así que básicamente ese bloque output dijo que este archivo debería crearse y no lo fue. A continuación dice que este es el comando que se ejecutó. Así que esto es básicamente el contenido de ese archivo .command.sh. Así es como se veía después de que todas esas variables se pusieron.
Y puedes ver aquí nuestro comando echo en realidad solo se ha ejecutado una vez y ha usado el array completo, pero en una representación de cadena, lo cual no es realmente lo que queríamos.
Y luego el comando salió así, y ese fue el directorio work donde podemos ir y ver los archivos para entender un poco más.
Bien. Entonces lo que pasó fue. Nextflow simplemente pasó este array completo como un solo elemento de canal al proceso, lo que significó que el proceso solo se ejecutó una vez. Tenía una tarea y no usó los datos en una estructura que esperábamos.
3.2. Usar un operador para transformar el contenido del canal¶
Así que necesitamos hacer algo con este canal primero, antes de que pueda ser usado. Y esto está preparando el escenario para usar operadores, que son funciones especiales que podemos usar en los canales para manipular el contenido del canal.
En este caso, vamos a usar algo llamado flatten. Que pasamos al final del canal aquí. Así que creamos el canal y luego ejecutamos flatten. Y de nuevo, si paso el cursor sobre él, me muestra la documentación para este comando directamente en VS Code, lo cual es muy útil. También puedes encontrar toda esta documentación en el sitio web de Nextflow, la documentación.
Podría simplemente ejecutar este código ahora y ver si funciona, pero también es una buena oportunidad para presentar cómo hacer código dinámico dentro de operadores y dentro del código de Nextflow, que se llaman closures.
Así que voy a agregar de nuevo un comando view aquí antes de que ejecutemos flatten. Y aquí este tiene estas llaves onduladas, que es el closure dinámico. Y solo hay algo de código arbitrario dentro de aquí que se ejecutará, dentro del contexto de un operador view.
Aquí, esto dice toma el saludo, que es la entrada del operador view, y eso está aquí. Podría llamar a esto como quisiera, podría llamar a esto "foo" y solo necesito referirme a él como "foo" más tarde. Y luego digo con esto, devuelve esto.
Y luego establecer devolviendo una cadena que dice antes del flatten para una variable. muy simple.
Ahora voy a agregar otro exactamente igual, pero voy a decir después flatten.
Así que lo que esto hace, porque esto se ejecuta en secuencia, vas a ver cómo se ve el canal antes de que ejecutemos flatten, y luego de nuevo después de que ejecutemos flatten.
Y luego este canal greeting todavía se crea, por lo que todavía se va a pasar al proceso. Y con suerte ahora el workflow se ejecutará. Probémoslo.
Genial. Así que lo primero es que el pipeline no falló esta vez. Tuvimos tres procesos que se ejecutaron correctamente y tenemos una pequeña marca de verificación. Y luego podemos ver que nuestras declaraciones view funcionaron.
Tenemos antes flatten, que es ese array que vimos antes del fallo, y luego tenemos tres veces el después flatten fue llamado donde tenemos "Hello", "Bonjour", y todos esos otros tres elementos separados en el array, que ahora son como esperábamos, tres elementos separados en el canal.
Y puedes ver que el operador view se ejecutó tres veces. Y eso es porque este canal después de flatten ahora tiene tres elementos. Y entonces el operador se llama tres veces.
Muy rápidamente, solo mencionaría que cuando estaba creando fábricas de canales antes, hice ".", y luego vimos que había muchas formas diferentes de crear canales, y una de ellas se llama "fromList". Y eso en realidad está específicamente diseñado para hacer esta misma operación. Así que podríamos haber hecho simplemente from list greetings away, y eso funcionará. Es una sintaxis un poco más limpia y agradable. Pero para los propósitos de esta demostración, queríamos hacerlo un poco más paso a paso para que pudieras ver cómo se está manipulando el canal y cómo diferentes operadores pueden cambiar lo que está en el contenido de un canal.
4. Leer valores de entrada desde un archivo CSV¶
Bien, ¿cómo podemos hacer esto un poco más realista? Probablemente no vas a querer estar creando mucho código en tu pipeline de Nextflow con arrays codificados. Probablemente vas a querer tomar los datos desde fuera cuando los lances, y esos datos casi seguramente estarán en archivos.
Así que lo siguiente que vamos a hacer es que vamos a replicar esto, pero en lugar de tomar los datos de un solo parámetro CLI o de una cadena o array codificados, vamos a tomarlo de un archivo.
Así que deshagámonos de nuestro greetings away. Y ahora vamos a cambiar esta fábrica de canales de nuevo. Acabo de decir que había un montón para elegir y hay uno llamado ".fromPath". Y voy a decirle que, en este caso, tome params.input, que es volver a nuestra entrada que estábamos usando antes.
Ahora ese parámetro realmente no está listo para ser usado todavía. Todavía estamos diciendo que es una cadena y está codificado aquí con un valor predeterminado, pero podríamos sobrescribir esa cadena. Ahora queremos que esto sea un archivo en su lugar. Así que el tipo es diferente. Ya no es un String. Es un Path.
Y luego podemos establecer el valor predeterminado si queremos, de nuevo, a un Path. Y si miro en explorar a la izquierda, puedes ver en este repositorio, en este directorio de trabajo, tengo un directorio llamado data. Tengo un archivo allí llamado "greetings.csv".
Así que solo puedo establecer el valor predeterminado aquí a "data/greetings.csv". Ahora, cuando ejecute este pipeline de nuevo sin ninguna opción de línea de comandos, usará este valor predeterminado. Sabe que es una ruta, así que sabe que debería manejar eso como una ruta y no una cadena.
Y luego va a pasar eso a una fábrica de canales desde este params.input y crear nuestro canal, que luego va a ser usado en este proceso llamado sayHello. Probémoslo.
Bien. Falló. No te preocupes. Esto era esperado. Y si estás siguiendo el material de capacitación, verás que también era esperado allí. Veamos qué está pasando aquí.
Intentó ejecutar el pipeline. Intentó ejecutar el proceso, y tiene un error bastante similar al que vimos antes.
Aquí dice: intentamos ejecutar echo, pero en lugar de hacer eco del contenido de este archivo CSV, solo hizo eco de la ruta. Y puedes ver que es la ruta absoluta completa aquí a este archivo CSV.
Y luego, efectivamente, porque intentó escribir eso a esta ruta realmente complicada, realmente no sabía qué hacer. Y estaba fuera del alcance del directorio work del proceso.
Mencioné al principio que Nextflow encapsula cada tarea ejecutada dentro de un directorio work especial. Y si intentas escribir datos, que están fuera de ese directorio work, Nextflow te detendrá como una precaución de seguridad. Y eso es lo que ha pasado aquí. Intentamos escribir a una ruta absoluta y Nextflow falló y nos lo impidió.
4.2. Usar el operador splitCsv() para analizar el archivo¶
Bien, echemos un vistazo a este canal y veamos cómo se ve. Podemos hacer ".view", y he copiado esto del sitio web. Así que .view, y tenemos un closure dinámico aquí y decimos un nombre de variable "csv" como entrada. Así que eso es el contenido del canal, y decimos antes de splitCsv, y así es como se ve.
Si lo ejecuto de nuevo, todavía fallará, pero nos mostrará qué hay dentro de este canal. No es particularmente emocionante. Es esa variable path. Así que puedes ver que es solo una cadena aquí porque se está imprimiendo en una terminal, pero es un objeto path, que contiene la información y metadatos sobre este archivo.
No queremos pasar los metadatos del archivo a la entrada. Queremos pasar el contenido de ese archivo. Si miramos el archivo greetings.csv, puedes ver aquí que tiene estas diferentes variables aquí. Hello, Bonjour, Holà de nuevo. Y estas son las cosas realmente que queremos pasar a nuestro proceso, no solo el archivo en sí como un solo objeto.
Así que necesitamos analizar este archivo CSV. Necesitamos desempacarlo, acceder al contenido del archivo CSV, y luego pasar el contenido dentro del canal al proceso.
Como probablemente puedes decir del mensaje de registro, queremos usar el splitCsv, que es otro operador, otro operador de canal. Así que si hago "dot" "s", y luego puedes ver que está autosugerido. Oops, splitCsv y algunos paréntesis.
Y luego después de splitCsv, voy a poner otra declaración view solo para que podamos ver cómo se ve después. Ejecutemos el pipeline y veamos qué tenemos.
Bien. Todavía falló, pero de una manera nueva y emocionante, lo cual es progreso.
Esta vez de nuevo, tenemos algún problema con nuestro script, que se ha renderizado. Ahora. Ya no tenemos la ruta final, pero tenemos un array de variables, que se ve mucho como el error que tuvimos antes cuando estábamos pasando un array como una entrada fija.
Con nuestro registro del operador view, podemos ver antes splitCsv era la ruta. Y efectivamente, después de splitCsv, tenemos tres salidas diferentes y cada una de esas salidas se ve muchísimo como cada una de las filas del archivo greetings.csv, lo cual tiene sentido.
Así que lo que ha pasado aquí es que Nextflow ha analizado este archivo CSV dándonos tres objetos, un array para cada línea del archivo CSV. Así que luego tres veces hemos pasado un array de variables al canal en lugar de un solo valor de cadena.
Bien, entonces la última vez que tuvimos este problema, usamos flatten. Probemos flatten rápidamente. Y veamos qué pasa.
Puedo llamar a estas variables, como sea. Así que voy a llamarlo myarray porque ya no es realmente un CSV. Intentemos ejecutarlo de nuevo y veamos qué pasa con flatten.
Así que esta vez vamos a ejecutar, analizamos el CSV en tres objetos de array, y luego lo aplanamos. Y esta vez, pasó. Y el pipeline de Nextflow se ejecutó. Sin embargo puedes ver que flatten realmente se pone manos a la obra y aplana todo. Y entonces obtenemos tres entradas de array independientes para cada fila. Y entonces ejecutó el proceso tres veces cada fila de un CSV. Y ahora tenemos un montón de archivos de resultados, y 123, 456, y todo tipo de cosas, no solo esa primera columna del CSV, que es lo que realmente queríamos.
4.3. Usar el operador map() para extraer los saludos¶
Entonces, ¿cómo accedemos solo a la primera columna? Si flatten es demasiado simplista aquí, necesitamos un operador más complejo donde podamos realmente personalizar y decirle lo que queremos del CSV.
Para hacer eso, vamos a usar map. Básicamente map solo dice, ejecuta algo de código, alguna función sobre cada elemento que me den y haz algún tipo de transformación en él. Y porque es tan flexible, lo verás aparecer en el código de Nextflow todo el tiempo.
Por sí mismo, no hace nada. Así que no queremos paréntesis regulares, queremos un closure aquí y necesitamos decirle qué hacer. Así que voy a decir "row", porque se le están dando filas del CSV, así que es un nombre de variable lógico. Es la entrada. Y quiero devolver solo el primer elemento de ese array.
Los arrays en Nextflow están basados en cero, así que vamos a decir solo el primer elemento, que es fila cero. Si quisiéramos la segunda columna, podría ser uno o la tercera columna ser dos, y así sucesivamente. Podemos devolver lo que queramos aquí, pero voy a devolver solo el primer valor.
Y ahora, podemos ejecutar el pipeline de nuevo y ver si hace lo que esperamos.
Efectivamente, después de splitCsv tenemos nuestros arrays, y luego después del map, tenemos nuestras cadenas limpias y agradables, solo "Hello", "Bonjour" y "Holà". Y el pipeline ahora está haciendo lo que queremos. Fantástico.
Así que podemos deshacernos de todos estos comandos view ahora. Ya no los necesitamos.
Resumen¶
Terminamos nuestra depuración y este es el código con el que terminamos. Tomando nuestro parámetro CLI llamado input, que está clasificado como un Path. Nextflow encuentra la ruta, la carga y entiende el archivo CSV. Devuelve todas las diferentes filas. Y luego mapeamos solo el primer elemento de esa fila en el canal que nos da el contenido del canal, que se pasa al proceso.
Y el proceso se ejecuta sobre cada elemento en el canal, que son tres. Y ejecuta el proceso tres veces, dándole tres tareas. Y esos resultados se publican desde el workflow, recogidos por la salida del proceso. Publicados desde un workflow y guardados en el bloque output a un subdirectorio llamado "hello_channels".
Muy genial. Ahora estamos llegando a algo que se parece más a un pipeline de Nextflow de la vida real que podrías ejecutar para algún análisis real.
Conclusión¶
Bien. Con suerte ahora estás teniendo una idea de qué son los canales y operadores de Nextflow y cómo funcionan los operadores en los canales y cómo puedes crearlos.
Los canales, como dije al principio de este video, son el pegamento de Nextflow. Y puedes ver aquí que podemos tomar diferentes entradas y manipularlas y tomar esos datos y luego pasarlos a la lógica del workflow posterior.
Y este bloque workflow aquí es realmente donde construyes toda esa paralelización y toda la lógica inteligente, y explicas a Nextflow cómo construir tu DAG de workflow, y cómo orquestar tu pipeline.
Los canales no son el concepto más fácil de entender. Así que toma un descanso, piensa un poco sobre esto, tal vez lee el material de nuevo, y realmente asegúrate de que tienes estos conceptos claros porque esto es clave para tu comprensión de Nextflow y cuanto mejor entiendas los canales y los diferentes operadores de canal y las diferentes fábricas de canales. Más divertido tendrás escribiendo Nextflow y más poderosos serán tus pipelines.
Esto no es lo mismo que la programación regular en Python u otros lenguajes. No estamos usando declaraciones if aquí, esto es programación funcional de flujo usando canales y operadores. Así que es un poco diferente, pero también es súper poderoso.
Ese es el final de este capítulo. Ve y toma un descanso rápido y te veré en el próximo video para la parte tres donde vamos a repasar Hello Workflow, y hablar un poco más sobre los workflows.
Al igual que el capítulo anterior, hay algunas preguntas de prueba en la parte inferior de la página web aquí, así que puedes hacer una repasada rápida de estas y asegurarte de que entiendes todas las diferentes partes del material que acabamos de hacer. Y aparte de eso, te veré en el próximo video. Muchas gracias.
Bien.