У меня есть конвейер Nextflow с двумя каналами.
.tsv
файлов в папку под названием «Результаты»..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, и документация не помогает мне так, как хотелось бы!
Ваш 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. Теперь проблема заключается в том, что он успешно создает отчет внутри определенной рабочей папки, в которую я копирую свой файл .Rmd, однако я все еще получаю сообщение об ошибке, в котором говорится, что «отсутствует выходной файл (ы) «report.pdf», ожидаемый процессом 'createReport'. Это странно, потому что, когда я заглядываю в рабочую папку, я вижу желаемый вывод. Так что все работает отлично, и я получаю желаемый результат, за исключением этой ошибки.
@CornOnTheCob Вы получите ошибку missing output files(s)
, если файл(ы), объявленные в объявлении вывода, не могут быть найдены в рабочем каталоге процесса (например, work/9f/bdc4d3...
) при завершении процесса (успешно). Убедитесь, что «report.pdf» записывается в этот каталог, когда процесс завершается. По умолчанию Nextflow обрабатывает входные файлы с помощью символических ссылок. В приведенном выше ответе Rmd будет помещен в рабочий каталог процесса с использованием символической ссылки. В какой каталог вы копируете файл Rmd?
Большое спасибо за ответ!! Я отредактировал свой процесс createReport и раздел рабочего процесса, однако кажется, что процесс createReport не работает должным образом. Я получаю статус существования команды: ошибка 127. Это происходит, когда я дохожу до строки "Rscript -e "rmarkdown::render('createReport.Rmd')". Возможно, я написал эту команду неправильно?