Come faccio a Sweave un progetto più file?
-
27-09-2019 - |
Domanda
Sto scrivendo la mia tesi in LaTeX e perché le cose sono un po 'lungo per i miei gusti, ho dovuto dividerlo in più file. Chiamiamoli thesis.tex
, intro.tex
, mat_n_met.tex
, rslts.tex
e discsn.tex
. Ho collegato intro.tex
, mat_n_met.tex
, rslts.tex
e discsn.tex
attraverso thesis.tex
con \include{intro}
(e così via ...).
Ho anche creato un file separato chiamato r_crunching.Rnw
(che ho eseguito attraverso Sweave) che contiene un pezzo che esegue lo script R con analisi dei dati e blocchi che producono uscite pdf di grafici che incorporano via \includegraphics
(a esempio, rslts.tex
). Sempre seguendo?
Se corro un Rnw (cioè io rslts.tex
rinominato rslts.Rnw
) senza "un collegamento" per il pezzo con lo script R, si otterrà un errore di Sweave()
dicendo che il riferimento nel \Sexpr{}
non esiste. C'è un modo, senza unire tutti i file in un unico .Rnw, alla chiamata \Sexpr{}
nel dire rslts.Rnw
?
Altri metodi come per raggiungere questo obiettivo sono i benvenuti.
Soluzione
Dimenticate per un secondo che si tratta di Sweave e basti pensare al problema lattice - per le quali soluzioni \include
e offrire \includeonly
. Prova che con pochi semplici file di test.
Una volta che avete capito, ripiegare Sweave nel mix e solo lavoro come Sweave è dopo 'solo' una fase di pre-elaborazione, anche se molto intelligente.
Altri suggerimenti
mi consiglia di utilizzare RStudio ( http://www.rstudio.com/ide/ ). Sweave è ben integrato in questo IDE e supporta i documenti multi-file. Anche Synctex e TeX navigazione log degli errori continua a funzionare quando si lavora con i documenti multi-file.
Dal file master è possibile includere i file figlio utilizzando
\SweaveInput{Child.Rnw}
È possibile collegare un file bambino torna al file master includendo la direttiva
% !Rnw root = Master.Rnw
nel file secondario. In questo modo quando si lavora su un file secondario e della stampa che, RStudio sa per comporre il master file.
I dettagli sono spiegati nella documentazione RStudio a http://www.rstudio.com / ide / docs / authoring / multiple_rnw_files
Per espandere la risposta di mjm di Dirk e, vi suggerirei di usare \include
e di Makefiles.
Supponiamo di avere un file master: master.tex
. In quel file, di includere alcuni file .tex
e .Rnw
, cioè.
\include chapter1
\include chapter2
\include chapter3
....
Ora il seguente Makefile offre funzioni per la creazione dei file, .tex
.R
e .pdf
:
.SUFFIXES: .tex .pdf .Rnw .R
MAIN = master
##List your your .Rnw includes
RNWINCLUDES = chapter1 chapter2 chapter3
TEX = $(RNWINCLUDES:=.tex)
RFILES = $(RNWINCLUDES:=.R)
RNWFILES = $(INCLUDES:=.Rnw)
all: $(MAIN).pdf
$(MAIN).pdf: $(TEX) $(MAIN).tex
R: $(RFILES)
.Rnw.R:
R CMD Stangle $<
.Rnw.tex:
R CMD Sweave $<
.tex.pdf:
pdflatex $<
bibtex $*
pdflatex $<
pdflatex $<
In sostanza, il .SUFFIXES
fornire un insieme di regole per convertire da un formato di file ad un altro. Ad esempio, per convertire da .Rnw
a .R
, si usa il comando
`R CMD Stangle $<`
una risposta abbastanza ovvia è quella di utilizzare un makefile, possibilmente utilizzando il pacchetto cachesweave, per elaborare i file rilevanti nel giusto ordine.
La mia soluzione a progetti multi-file in Sweave (sotto Rstudio) è il seguente:
1) Creare un master file, dire master.Rnw
, in cui si hanno le chiamate ai sottofile intro.Rnw
, matmet.Rnw
, etc:
\documentclass[11pt]{book}
% \usepackage{blah, blah} as you wish
\graphicspath{ {./figs/}
\begin{document}
\SweaveOpts{concordance=TRUE}
\include{intro} % a call to 'intro.Rnw'
\include{matmet} % a call to 'matmet.Rnw'
\include{results} % a call to 'results.Rnw'
\include{discuss} % a call to 'discuss.Rnw'
\end{document}
2) Creare le sottofile. Sto dando qui solo il primo, intro.Rnw
. Si prega di notare che in subfile si Non utilizzare del preambolo comandi come \documentclass
o \begin{document}
\chapter{Introduction}\label{ch:intro}
\section{This is section 01}
In section 01 we are concerned about whether \texttt{Sexpr} could possibly work. The chunk below creates a variable \em{a} which will be referred to by this command later on.
<<>>=
a <- 1+2
@
Ok, if it is working, we shall see number 3 right here: \Sexpr{a}.
3) Dopo aver salvato le modifiche in 'intro.Rnw', basta andare alla 'master.Rnw' e compilarlo usando Ctrl + Shift + K e ... voilà: