Использование Rscript с файлом .Rnw И commandArgs () - PullRequest
0 голосов
/ 30 мая 2019

У меня есть файл .Rnw, содержащий фрагменты кода R и команды LaTeX. До сих пор я разрабатывал и тестировал этот код в Rstudio: щелкнул «compile PDF», чтобы получить некоторые выходные файлы и сгенерированный файл PDF.

Теперь я хотел бы использовать commandArgs (), чтобы дать моему .Rnw один единственный аргумент: файл YAML. Этот файл содержит все виды параметров, которые необходимы для сценария.

Чтобы дать некоторый контекст:

  • Мой сценарий .Rnw является конвейерным сценарием, который был разработан как можно более универсальным.

  • Мой сценарий .Rnw требует каждый раз несколько параметров - они будут разными в каждом проекте. Чтобы предоставить эти параметры, я в настоящее время (уже) использую файл конфигурации YAML. Это означает, что первое, что делает мой скрипт .Rnw, это импорт файла YAML, а затем он начинает что-то делать.

Моя проблема: могу ли я использовать "Rscript", "commandArgs ()" и knitr все вместе. Я надеялся, что мой addind некоторые commandArgs () к моему сценарию .Rnw, я смогу запустить все (т.е. дать аргумент в командной строке для предоставления файла YAML и компилировать PDF), например так:

Rscript script.Rnw params.yaml

Тем не менее, я получаю эту ошибку о "\", что, я сильно подозреваю, связано с тем фактом, что я использую файл .Rnw (и самое первое, что в нем - команда LaTeX). Затем я увидел потенциальное решение на других постах, таких как:

 Rscript -e "library(knitr); knit('script.Rnw')"
 pdflatex script.tex

Однако, это также терпит неудачу - неудивительно, что я полагаю, потому что я не дал ему мой файл конфигурации YAML.

Я понимаю, что мой дизайн, скорее всего, ошибочен: используя вместе команды commandAgrs () И knitr, я все усложняю. Я также понимаю, что knitr, возможно, не был действительно разработан для создания отчетов для сценариев, которые используются в качестве конвейеров (по крайней мере, это мое впечатление). Причина, по которой я хочу его использовать, заключается в том, что для каждого проекта можно создать быстрый PDF со всеми результатами.

Буду признателен за любой совет. Вот пример моего кода:

\documentclass[12pt, a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\hypersetup{
colorlinks   = true, %Colours links instead of ugly boxes
urlcolor     = blue, %Colour for external hyperlinks
linkcolor    = blue, %Colour of internal links
citecolor   = blue %Colour of citations
 }
\usepackage{caption}
\setlength{\parindent}{0pt}
\usepackage{authblk}
\usepackage[nomarkers, nolists]{endfloat} %Positions figures at the end of the document and add no list of names (requires that chunk have fig.cap option)
\usepackage{soul} % Allows underline lines to be broken (use \ul{} instead of \underline{})

\usepackage{helvet} %Set up Arial as font
\renewcommand{\familydefault}{\sfdefault}

\newcommand{\Rfunction}[1]{{\texttt{#1}}}
\newcommand{\Rpackage}[1]{{\textit{#1}}}

\title{\textbf{Report}}
\author{Author}
\date{\today}



\begin{document}

\maketitle

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in table of contents
\tableofcontents
\endgroup

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in list of figures
\listoffigures
\endgroup



\newpage
\section{Introduction} 
This report blah blah blah

\newpage
\section{Results}

<<importing-lib, echo=FALSE, message=FALSE, cache=TRUE>>=

###################################################
# Obtain command-line YAML file and set directory #
###################################################

#!/usr/bin/env Rscript
args= commandArgs(trailingOnly=TRUE)

if (length(args) == 0) {
 stop("this script requires a configuration file (.yaml) as input")

 } else if (length(args) > 1) {
  stop("this script requires only one input: a configuration file (.yaml)")

}

params <-  yaml.load_file(args[1])

setwd(params$workdir)

if (dir.exists(file.path(params$workdir, "results")) == FALSE) {
  dir.create(file.path(params$workdir, "results","edgeR"), recursive = TRUE)
  dir.create(file.path(params$workdir, "results", "gsea", "input_files"), recursive = TRUE)
}

print("Hello!")
@

\end{document}

1 Ответ

0 голосов
/ 31 мая 2019

Хорошо, поэтому я нашел 2 способа, как это работает:

Метод 1: использование командной строки knitr () и pdflatex

В этом случаевсе по-прежнему один сценарий (называемый script.Rnw), но он выглядит так:

\documentclass[12pt, a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\hypersetup{
colorlinks   = true, %Colours links instead of ugly boxes
urlcolor     = blue, %Colour for external hyperlinks
linkcolor    = blue, %Colour of internal links
citecolor   = blue %Colour of citations
 }
\usepackage{caption}
\setlength{\parindent}{0pt}
\usepackage{authblk}
\usepackage[nomarkers, nolists]{endfloat} %Positions figures at the end of the document and add no list of names (requires that chunk have fig.cap option)
\usepackage{soul} % Allows underline lines to be broken (use \ul{} instead of \underline{})

\usepackage{helvet} %Set up Arial as font
\renewcommand{\familydefault}{\sfdefault}

\newcommand{\Rfunction}[1]{{\texttt{#1}}}
\newcommand{\Rpackage}[1]{{\textit{#1}}}

\title{\textbf{Test report}}
\date{\today}



\begin{document}

\maketitle

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in table of contents
\tableofcontents
\endgroup

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in list of figures
\listoffigures
\endgroup



\newpage
\section{Introduction} 
This is the introduction.

\newpage
\section{Results}

This is the results.

<<importing-lib, echo=FALSE, message=FALSE>>=

###################################################
# Obtain command-line YAML file and set directory #
###################################################

#!/usr/bin/env Rscript
args= commandArgs(trailingOnly=TRUE)

if (length(args) == 0) {
  stop("this script requires a configuration file (.yaml) as input")

  # } else if (length(args) > 1) {
  # stop("this script requires only one input: a configuration file (.yaml)")

}

library(yaml)
params <- yaml.load_file(args[1])

dir <- getwd()

if (dir.exists(file.path(dir, "results")) == FALSE) {
  dir.create(file.path(dir, "results","part1"), recursive = TRUE)
  dir.create(file.path(dir, "results", "part2", "input_files"), recursive = TRUE)
}

print("Hello!")
print(params$project)
@



\newpage
\section{End}

This is the end!

\end{document}

Чтобы запустить конвейер:

Rscript -e "library(knitr); knit('script.Rnw')" params.yaml && pdflatex script.tex

Метод 2: разделение кода наФайл .Rnw и файл запуска .R

Скрипт. Rnw выглядит так:

\documentclass[12pt, a4paper]{article}

\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\hypersetup{
colorlinks   = true, %Colours links instead of ugly boxes
urlcolor     = blue, %Colour for external hyperlinks
linkcolor    = blue, %Colour of internal links
citecolor   = blue %Colour of citations
 }
\usepackage{caption}
\setlength{\parindent}{0pt}
\usepackage{authblk}
\usepackage[nomarkers, nolists]{endfloat} %Positions figures at the end of the document and add no list of names (requires that chunk have fig.cap option)
\usepackage{soul} % Allows underline lines to be broken (use \ul{} instead of \underline{})

\usepackage{helvet} %Set up Arial as font
\renewcommand{\familydefault}{\sfdefault}

\newcommand{\Rfunction}[1]{{\texttt{#1}}}
\newcommand{\Rpackage}[1]{{\textit{#1}}}

\title{\textbf{Test report}}
\date{\today}



\begin{document}

\maketitle

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in table of contents
\tableofcontents
\endgroup

\begingroup
\hypersetup{linkcolor=black} % force independent link colours in list of figures
\listoffigures
\endgroup



\newpage
\section{Introduction} 
This is the introduction.

\newpage
\section{Results}

This is the results.

<<first-chunk, echo=FALSE, message=FALSE>>=

print("Hello!")
print(params$project)
@



\newpage
\section{End}

This is the end!

\end{document}

Скрипт launch.R выглядит так:

#!/usr/bin/env Rscript

library(yaml)
library(knitr)

args= commandArgs(trailingOnly=TRUE)

if (length(args) == 0) {
  stop("this script requires a configuration file (.yaml) as input")

  # } else if (length(args) > 1) {
  # stop("this script requires only one input: a configuration file (.yaml)")

}

params <- yaml.load_file(args[1])

dir <- getwd()

if (dir.exists(file.path(dir, "results")) == FALSE) {
  dir.create(file.path(dir, "results","edgeR"), recursive = TRUE)
  dir.create(file.path(dir, "results", "gsea", "input_files"), recursive = TRUE)
}

knit2pdf('script.Rnw')

Чтобы запустить скрипт:

Rscript launch.R params.yaml

Одно из различий между методами: метод 1 генерирует больше файлов (* tex, * toc, * out, * log, * aux), предположительно, потому что это технически 2 команды,Метод 2 генерирует только файлы .tex и .pdf.

...