How to make sweave copy generated graphics to a subfolder? - r

I would love to use some shell script based pdfcrop on all the graphics.pdf created from my Sweave report. Hence i'd be nice if all the graphics were stored to a subfolder instead of being dropped where all the latex stuff like .aux .log files (and so on) is located. If I just had to use the crop script on ALL files in a particular directory it would be much easier.
Here's my Sweave chunk:
\begin{figure}[htbp]
\begin{center}
<<fig=true,echo=false>>=
print(mygraph)
#
\caption{my graph}
\end{center}
\end{figure}
If I run the sweave code mygraph.pdf is stored in the same directory as the report.tex file itself.
Is there a way to store this file in an existing subfolder like /graphics ?

Insert this:
\SweaveOpts{prefix.string=foo/bar}
into your Sweave source file, preferably up the top in the preamble. The above line is taken from the Sweave FAQ, and indicates that the created figures will be stored in the subdirectory (of the directory where the Sweave source is) foo, and each image filename will begin with bar. This, and a whole lot more is discussed in the Sweave FAQ.

Okay RTFM, ran2.
Here's how:
\SweaveOpts{prefix.string=graphics/report}
See also: the manual.
graphics is directory and report is a substring you might wanna use. At least you'll find SO better on google :)
EDIT:
For the sake of completeness I'll add my several lines of shell script here:
#!/bin/sh
R CMD Sweave report.Rnw
for file in `ls graphics`;
do pdfcrop "$file" graphics/"$file"
done
pdflatex report.tex
open report.pdf
Maybe some of you want to use $1 as a directory argument.

Related

Include RNW file

Code
\input{./A1_sample/sample.Rnw}
How to include Rnw file so that the R code in the file is executed? Using \input does not work.
The command is \SweaveInput.
Usage:
\begin{document}
\SweaveInput{PATH_TO_RNW_FILE/RNW_FILE.Rnw}
\end{document}
For further information see: https://support.rstudio.com/hc/en-us/articles/200486298-Working-with-Multiple-Rnw-Files
The patchDVI package provides various project management facilities for handling multiple file documents. It requires a bit of setup, but works well in TeXShop or TeXworks. Unfortunately I don't think RStudio can be easily customized to use it.
Your document main.Rnw would look something like this:
\documentclass{article}
<<echo=FALSE,results="asis">>=
# .SweaveMake <- 2 # For complete make, uncomment this
.SweaveFiles <- c("file1.Rnw", "file2.Rnw", "file3.Rnw")
.TexRoot <- "main.tex"
#
\begin{document}
\input{file1}
\input{file2}
\input{file3}
\end{document}
Each of the file*.Rnw files would have a similar header, listing main.Rnw and other dependent files as .SweaveFiles. Then the compiler can be told to run Sweave on all changed files and LaTeX on main.tex when it processes the file.

Using graphicspath in latex/sweave

I have an Sweave file, where I need to embed a png and pdf from another folder. This is how I tried it
\usepackage{graphicx}
\graphicspath{{inst/extdata/}}
\DeclareGraphicsExtensions{.pdf,.png}
\begin{document}
\begin{figure}
\includegraphics[scale=0.7]{image.png}
\caption{captionA}
\label{fig:labelA}
\end{figure}
I also tried like this, but this didn't work:
\graphicspath{{filePath}}
filePath = "C:/path"
\begin{figure}
\includegraphics[scale=0.7]{image.png}
\caption{captionA}
\label{fig:labelA}
\end{figure}
I have googled a lot, and look up https://en.wikibooks.org/wiki/LaTeX/Importing_Graphics#Compiling_with_latex, but this is the error I get.
LaTeX Warning: File `image.png' not found on input
line 613.
! Package pdftex.def Error: File `image.png' not found.
See the pdftex.def package documentation for explanation.
Type H <return> for immediate help.
...
l.613 ...]{image.png}
I expand my comment with three different ways of achieve your goal; Suppose you want to include a file image named IMG_7254.JPG (note that I do not write the file extension in the following code because I use the \DeclareGraphicsExtensions{.JPG}), You can do it in three ways:
to put the file to compile (the .tex one) and the image to include in the same folder. LaTeX searches (by default) for pictures to include in documents in the same directory where the file to be compiled is. In this case the code is just:
\includegraphics[width=0.7\textwidth]{IMG_7254}
Have pictures and file to compile in very different folders, in this case you must specify the complete path of the file (it can be found in different ways), example with Mac OS read here. In this case the code is:
\includegraphics[width=0.7\textwidth]{/Users/SabDeM/Pictures/IMG_7254}
to put the file to compile in a folder (say File_to_com), then put all pictures to include in a sub folder, say, File_to_com/picturesToInc, and then specify the path. In this latter case the code is:
\includegraphics[width=0.7\textwidth]{picturesToInc/IMG_7254}
As you can see in all ways (one way or another) LaTeX (which render the PDF) must to know where the pictures are located in your computer.

Adding XeTeX to ess-swv-PDF

I am working with an .Rnw file with Hebrew in it, and I would like to compile the resulting .tex file using XeTeX. I work in Emacs, so I am using the Emacs Speaks Statistics (ESS) package, which allows a few options for compiling the .tex file. However, using XeTeX is not currently among the possible selections of ess-swv-PDF, accessed via M-n P.
I would like to add XeTeX to this list. Ideally, this added option would allow me to not only compile the .tex file using XeTeX but also run, as needed, BibTeX on the same file—all from a buffer displaying the .Rnw file. This would be similar to texi2pdf, one of the current options of ess-swv-PDF.
This can be customized if you have ESS already installed: M-x customize-group select ess-sweave and edit ess-swv-pdflatex-commands to add "xelatex" to them. If you want to use xelatex or xetex as the default TeX engine, like I do, you can put that in front (see screenshot below).
Then press Apply and save this should save code into your .init.el or .emacs.el, depending on your setting.
Now when you go to your .Rnw file and hit M-n P you will see xelatex as default since you put it ahead of other commands. That is all to it.

How to convert R Markdown to HTML? I.e., What does "Knit HTML" do in Rstudio 0.96?

What commands are run when pressing "Knit HTML" on an R Markdown file in Rstudio 0.96?
My motivation is that I might want to run the same command when I'm in another text editing environment or I might want to combine the command in a larger makefile.
Basic Script
So now that the R markdown package has been released, here is some code to replicate the features of Knit to Html.
require(knitr) # required for knitting from rmd to md
require(markdown) # required for md to html
knit('test.rmd', 'test.md') # creates md file
markdownToHTML('test.md', 'test.html') # creates html file
browseURL(paste('file://', file.path(getwd(),'test.html'), sep='')) # open file in browser
where test.rmd is the name of your R markdown file.
Note that I'm not 100% confident about the browseURL line (hence my question here about opening files in a web browser).
markdownToHTML Options
The good thing about markdownToHTML is that there are heaps of options in how the HTML is created (see ?markdownHTMLOptions). So for example, if you want just a code fragment without all the header information, you could write:
markdownToHTML('test.md', 'test.html', options='fragment_only')
or if you don't like hard wrapping (i.e., inserting line breaks when there are single manual line breaks in the markdown source), you can omit the 'hard_wrap' option.
# The default options are 'hard_wrap', 'use_xhtml',
# 'smartypants', and 'base64_images'.
markdownToHTML('test.md', 'test.html',
options=c('use_xhtml', 'base64_images'))
Makefile
This could also all be added to a makefile perhaps using Rscript -e (e.g., something like this). Here's a basic example makefile I put together, where test indicates that the rmd file is called test.rmd.
RMDFILE=test
html :
Rscript -e "require(knitr); require(markdown); knit('$(RMDFILE).rmd', '$(RMDFILE).md'); markdownToHTML('$(RMDFILE).md', '$(RMDFILE).html', options=c('use_xhtml', 'base64_images')); browseURL(paste('file://', file.path(getwd(),'$(RMDFILE).html'), sep=''))"
The makefile uses my preferred markdown options: i.e., options=c('use_xhtml', 'base64_images')
Put Sys.sleep(30) in a chunk and you will see clearly what commands are called by RStudio. Basically they are
library(knitr); knit() to get the markdown file;
RStudio has internal functions to convert markdown to HTML;
The second step will be more transparent in the next version of the markdown package. Currently you can use knitr::knit2html('your_file.Rmd') to get a similar HTML file as RStudio gives you.
Update on 2019/09/17: The above answer applies to RStudio v0.96 (in the year 2012). Now R Markdown is compiled through rmarkdown::render(), which uses Pandoc instead of the retired R package markdown. See the post Relationship between R Markdown, Knitr, Pandoc, and Bookdown for more details.
Very easy command line method from knitr in a knutshell:
R -e "rmarkdown::render('knitr_example.Rmd')"
This requires rmarkdown to be installed with install.packages(rmarkdown) and that pandoc is installed (apparently it comes with Rstudio, see knitr in a knutshell for more details).
So far when I've used this it nicely puts all the plots in the HTML file rather than as images in a figure directory and cleans up any intermediate files, if any; just like compilation in RStudio does.
It seems you should call rmarkdown::render() instead of knitr::knit2html() because a.rmd appears to be an R Markdown v2 document.

How do I Sweave a multiple-file project?

I am writing my thesis in LaTeX and because things got a bit long for my taste, I had split it into several files. Let's call them thesis.tex, intro.tex, mat_n_met.tex, rslts.tex and discsn.tex. I have linked intro.tex, mat_n_met.tex, rslts.tex and discsn.tex through thesis.tex with \include{intro} (and so on...).
I have also created a separate file called r_crunching.Rnw (that I run through Sweave) that holds a chunk that runs the R script with data analysis and chunks that produce pdf outputs of graphs that I embed via \includegraphics (in e.g., rslts.tex). Still following?
If I run a Rnw (i.e. I renamed rslts.tex to rslts.Rnw) without "a link" to the chunk with the R script, you will get a Sweave() error saying the reference in \Sexpr{} doesn't exist. Is there a way, without merging all the files into a single .Rnw, to call \Sexpr{} in say rslts.Rnw?
Other methods how to accomplish this are welcome.
I recommend using RStudio (http://www.rstudio.com/ide/). Sweave is nicely integrated into that IDE and it supports multi-file documents. Even Synctex and TeX error log navigation still work when working with multi-file documents.
From the master file you can include child files using
\SweaveInput{Child.Rnw}
You can link a child file back to the master file by including the directive
% !Rnw root = Master.Rnw
in the child file. That way when working on a child file and typesetting it, RStudio know to typeset the master file.
The details are explained in the RStudio documentation at http://www.rstudio.com/ide/docs/authoring/multiple_rnw_files
Forget for a second that you are dealing with Sweave and just think of the latex problem -- for which \include and \includeonly offer solutions. Try that with a few simple test files.
Once you have that figured out, fold Sweave back into the mix and it just work as Sweave is after 'merely' a pre-processing step, albeit a very clever one.
To expand Dirk's and mjm's answer, I would suggest using \include's and Makefiles.
Suppose you have a master file: master.tex. In that file, you include some .tex and .Rnw files, i.e.
\include chapter1
\include chapter2
\include chapter3
....
Now the following Makefile provides functions for creating the .tex, .R and .pdf files:
.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 $<
Essentially, the .SUFFIXES provide a set of rules for convert from one file format to another. For example, to convert from .Rnw to .R, we use the command
`R CMD Stangle $<`
one fairly obvious answer is to use a makefile, possibly using package cachesweave, to process the relevant files in the right order.
My solution to multi-file projects in Sweave (under Rstudio) is the following:
1) Create a master file, say master.Rnw, in which you have the calls to the subfiles 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) Create the subfiles. I'm giving here only the first one, intro.Rnw. Please note that in the subfiles you do not use preambular commands such as \documentclass or \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) After saving modifications in 'intro.Rnw', simply go to 'master.Rnw' and compile it using Ctrl+Shift+K and... voilá:
Screenshot of the file created by the above command.

Resources