Как передать вывод из одного канала Nextflow в другой и запустить файл .Rmd?

У меня есть конвейер Nextflow с двумя каналами.

  • Первый канал запускается и выводит 6 .tsv файлов в папку под названием «Результаты».
  • Предполагается, что второй канал будет использовать все эти 6 файлов .tsv и создавать отчет в формате .pdf, используя Knitr в R в процессе под названием «createReport».

Мой код рабочего процесса выглядит так:

workflow {
  inputFileChannel = Channel.fromPath(params.pathOfInputFile, type: 'file') // | collect | createReport // creating channel to pass in input file
  findNumOfProteins(inputFileChannel)  // passing in the channel to the process
  findAminoAcidFrequency(inputFileChannel)
  getProteinDescriptions(inputFileChannel)
  getNumberOfLines(inputFileChannel)
  getNumberOfLinesWithoutSpaces(inputFileChannel)
  getLengthFreq(inputFileChannel)

  outputFileChannel = Channel.fromPath("$params.outdir.main/*.tsv", type: 'file').buffer(size:6)
  createReport(outputFileChannel)

Мой процесс createReport в настоящее время выглядит так:

process createReport {
  module 'R/4.2.2'

  publishDir params.outdir.output, mode: 'copy'


  output:
    path 'report.pdf'

  script:
      """
          R -e "rmarkdown::render('./createReport.Rmd')"
      """
}

И мой 'createReport.Rmd' выглядит так (проверено в Rstudio и дает правильный вывод в формате .pdf:

---
title: "R Markdown Practice"
author: "-"
date: "2022-12-08"
output: pdf_document
---

{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)

library(readr)
dataSet <- list.files(path = "/Users/-/Desktop/code/nextflow_practice/results/", pattern = "*.tsv")
print(dataSet)

for (data in dataSet) {
  print(paste("Showing the table for:", data))
  targetData <- read.table(file=paste("/Users/-/Desktop/code/nextflow_practice/results/", data, sep = ""),
             head=TRUE,
             nrows=5,
             sep = "\t") 
  print(targetData)
  
  if (data == "length_data.tsv") {
    data_to_graph <- read_tsv(paste("/Users/-/Desktop/code/nextflow_practice/results/", data, sep = ""), show_col_types = FALSE)
    plot(x = data_to_graph$LENGTH,y = data_to_graph$FREQ, xlab = "x-axis", ylab = "y-axis", main = "P")
  }

  writeLines("-----------------------------------------------------------------")
}

Как правильно написать процесс createReport и разделы рабочего процесса, чтобы можно было передать 6 выходных данных .tsv из первого канала во второй канал для создания отчета?

Извините, я новичок в Nextflow, и документация не помогает мне так, как хотелось бы!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш outputFileChannel выглядит так, как будто он пытается получить доступ к файлам в publishDir. Проблема с доступом к файлам в этом каталоге (то есть «результаты») заключается в следующем:

Файлы копируются в указанный каталог в асинхронном образом, поэтому они не могут быть немедленно доступны в опубликованных каталог в конце выполнения процесса. По этой причине файлы опубликованные процессом, не должны быть доступны другим нижестоящим процессы.

Предполагая, что ваш inputFileChannel предназначен для канала значений , вы можете использовать следующее. Для этого необходимо, чтобы выходы шести процессов были объявлены в их выходных блоках (с использованием квалификатора пути ). Затем мы могли бы просто смешать и собрать эти файлы. Затем ваш файл Rmd и список файлов TSV могут быть переданы вашему процессу createReport. Обратите внимание: если вы переместите свой Rmd в базовый каталог вашего пайплайн-проекта (то есть в тот же каталог, что и ваш скрипт main.nf), вы сможете распространять его вместе со своим рабочим процессом. Предоставляя Rmd по каналу, этот подход обеспечивает его размещение в рабочем каталоге процесса при выполнении задания. Например:

workflow {

    inputFile = file( params.pathOfInputFile )

    findNumOfProteins( inputFile )
    findAminoAcidFrequency( inputFile )
    getProteinDescriptions( inputFile )
    getNumberOfLines( inputFile )
    getNumberOfLinesWithoutSpaces( inputFile )
    getLengthFreq( inputFile )

    Channel.empty() \
        | mix( findNumOfProteins.out ) \
        | mix( findAminoAcidFrequency.out ) \
        | mix( getProteinDescriptions.out ) \
        | mix( getNumberOfLines.out ) \
        | mix( getNumberOfLinesWithoutSpaces.out ) \
        | mix( getLengthFreq.out ) \
        | collect \
        | set { outputs }

    rmd = file("${baseDir}/createReport.Rmd")

    createReport( outputs, rmd )
}
process createReport {

    module 'R/4.2.2'

    publishDir "${params.outdir}/report", mode: 'copy'

    input:
    path 'input_dir/*'
    path rmd

    output:
    path 'report.pdf'

    """
    Rscript -e "rmarkdown::render('${rmd}')"
    """
}

Обратите внимание, что описанный выше процесс createReport помещает входные TSV-файлы в папку с именем input_dir в рабочем каталоге процесса. Вы можете изменить это, если хотите, но я думаю, что это сохраняет рабочий каталог в чистоте и порядке. Просто не забудьте изменить свой сценарий Rmd, чтобы он указывал на эту папку. Например, вы можете использовать что-то вроде:

dataSet <- list.files(path = "./input_dir", pattern = "*.tsv")

Или, возможно, даже:

dataSet <- list.files(pattern = "*.tsv", recursive=TRUE)

Большое спасибо за ответ!! Я отредактировал свой процесс createReport и раздел рабочего процесса, однако кажется, что процесс createReport не работает должным образом. Я получаю статус существования команды: ошибка 127. Это происходит, когда я дохожу до строки "Rscript -e "rmarkdown::render('createReport.Rmd')". Возможно, я написал эту команду неправильно?

CornOnTheCob 11.12.2022 21:05

Ничего себе, я разобрался! Теперь я успешно передаю выходные данные из первого канала в процесс createReport. Теперь проблема заключается в том, что он успешно создает отчет внутри определенной рабочей папки, в которую я копирую свой файл .Rmd, однако я все еще получаю сообщение об ошибке, в котором говорится, что «отсутствует выходной файл (ы) «report.pdf», ожидаемый процессом 'createReport'. Это странно, потому что, когда я заглядываю в рабочую папку, я вижу желаемый вывод. Так что все работает отлично, и я получаю желаемый результат, за исключением этой ошибки.

CornOnTheCob 11.12.2022 22:33

@CornOnTheCob Вы получите ошибку missing output files(s), если файл(ы), объявленные в объявлении вывода, не могут быть найдены в рабочем каталоге процесса (например, work/9f/bdc4d3...) при завершении процесса (успешно). Убедитесь, что «report.pdf» записывается в этот каталог, когда процесс завершается. По умолчанию Nextflow обрабатывает входные файлы с помощью символических ссылок. В приведенном выше ответе Rmd будет помещен в рабочий каталог процесса с использованием символической ссылки. В какой каталог вы копируете файл Rmd?

Steve 12.12.2022 01:24

Другие вопросы по теме