I have some difficulties implementing a (beamer) presentation. Everything works fine until I include a function which checks a specific condition and accordingly returns the output (graph - print text). Without that function it works fine. So how can I either graph or print the output?
\documentclass[10pt]{beamer}
\usepackage[T1]{fontenc}
\begin{document}
\begin{frame}{test}
<<echo=FALSE, fig.height = 4>>=
dates <- seq(as.Date("2015-02-13"), as.Date("2015-02-22"), by = "days")
b <- c(1,1,1,1,2,2,3,3,3,0)
c <- c(20,30,26,20,30,40,5,10,4,0)
d <- c(11,2233,12,2,22,13,23,23,100,0)
df <- data.frame(dates,b,c,d)
plot(df)
test <- function(df) {
if(sum(tail(df[2:ncol(df)], 1)) > 0) { # check only last date
return(plot(df))
} else {
print("Have a nice day!")
}
}
test(df)
#
\end{frame}
\end{document}
knitr wraps output in verbatim as can be seen from the TEX that the Rnw in the question produces:
\begin{frame}{test}
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{verbatim}
## [1] "Have a nice day!"
\end{verbatim}
\end{kframe}
\includegraphics[width=10cm,height=8cm]{figure/unnamed-chunk-2-1}
\end{knitrout}
\end{frame}
However:
It is straightforward to use Sweave or knitr with beamer; the only thing you need to be careful of is you have to add the fragile option to the frames that contain verbatim code. [Source]
Therefore, the frame needs the fragile option:
\begin{frame}[fragile]{test}
With fragile make sure not to indent \end{frame}. (This happened to me after copying the code from the question …)
Related
I am currently using knitr in R and RStudio to produce a LaTeX output. My code is a .Rnw file (called, say, testKnitr.Rnw) that is compiled to a pdf file with:
knit("testKnitr.Rnw") // in RStudio
pdflatex testKnitr.tex // in terminal
I would like to use an if-else syntax in LaTeX so that, depending on the value of an R variable, one of two LaTeX text paragraphs are output. In these LaTeX paragraphs, I would like to use expressions like \Sexpr{} and and \ref.
I have a minimal-working-example that is based on the second answer to a similar question posted here:
How to write an if-then statement in LaTeX using the value of an R variable in knitr/Sweave
Here is the MWE:
\documentclass{article}
\begin{document}
<<include=FALSE>>=
library(knitr)
opts_chunk$set(
concordance=TRUE
)
#
<<condition, include=FALSE, echo=FALSE>>=
x<- rnorm(1)
if(x>0){
text <- "This means x value of \Sexpr{x} was greater than 0"
}else{
text <- "This means x value of \Sexpr{x} was less than 0"
}
#
Testing the code:
<<print, results='asis', echo=FALSE>>=
cat(text)
#
\end{document}
Ideally, the intended output of the above MWE would a report with one line that contained something like:
"This means x value of 0.87 was greater than 0"
or
"This means x value of -0.87 was less than 0"
Before answering this question, I would like to take a look at the meta-question of whether this should be done.
Should we do it?
I don't think so. What we are basically doing here is using knitr to insert \Sexpr{x} in a document and then interpret \Sexpr{x}. There are no (obvious) reasons why we should take this detour instead of inserting the value of x directly to the document.
How to do it?
The following minimal example shows how it could be done anyways:
\documentclass{article}
\begin{document}
<<setup, echo = FALSE>>=
library(knitr)
knit_patterns$set(header.begin = NULL)
#
<<condition, echo=FALSE>>=
x <- rnorm(1)
if (x > 0) {
text <- "This means x value of \\Sexpr{x} was greater than 0"
} else {
text <- "This means x value of \\Sexpr{x} was less than 0"
}
#
Testing the code:
<<print, results='asis', echo=FALSE>>=
cat(text)
#
\end{document}
Two things are important here:
We need to escape the backslash in \Sexpr, resulting in \Sexpr.
We need to set knit_patterns$set(header.begin = NULL).
To compile the document:
Save it as doc.Rnw.
Then execute:
knitEnv <- new.env()
knit(input = "doc.Rnw", output = "intermediate.Rnw", envir = knitEnv)
knit2pdf(input = "intermediate.Rnw", output = "doc_final.tex", envir = knitEnv)
What happens?
The first call of knit generates intermediate.Rnw with the following content:
\documentclass{article}
\begin{document}
Testing the code:
This means x value of \Sexpr{x} was less than 0
\end{document}
You should note that knitr didn't include any definitions, commands etc. as usual to the LaTeX code. This is due to setting header.begin = NULL and documented here. We need this behavior because we want to knit the resulting document again in the second step and LaTeX doesn't like it when the same stuff is defined twice.
Creating the new environment knitEnv and setting it as envir is optional. If we skip this, the variable x will be created in the global environment.
In the second step we use knit2pdf to knit intermediate.Rnw and immediately generate a PDF afterwards. If envir was used in the first step, we need to use it here too. This is how x and it's value are conveyed from the first to the second knitting step.
This time all the gory LaTeX stuff is included and we get doc_final.tex with:
\documentclass{article}\usepackage[]{graphicx}\usepackage[]{color}
%% maxwidth is the original width if it is less than linewidth
%% otherwise use linewidth (to make sure the graphics do not exceed the margin)
\makeatletter
\def\maxwidth{ %
\ifdim\Gin#nat#width>\linewidth
\linewidth
\else
\Gin#nat#width
\fi
}
\makeatother
%% more gory stuff %%
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
Testing the code:
This means x value of \ensuremath{-0.294859} was less than 0
\end{document}
I'm a beginner in using knitr to generate a report.
I have a R script (see below for an example; BTW I'm using RStudio for all of this) that runs without error and the output is a data frame. My rnw.file looks like this:
% !Rnw weave = knitr
\documentclass[a4paper]{article}
\begin{document}
<<echo=FALSE,message=FALSE>>=
source("test.R")
kable(test.mat)
#
\end{document}
which displays the table quite nicely. The only problem I have is with the ">" (greater than) sign in the last column which is shown as "¿".
In found something about using
\usepackage[T1]{fontenc}
but this doesn't seem to do the trick here. Having included this, I can start compiling the script but after 10 minutes or so (and before it only took me some seconds to compile) I run into an error (exit code: 1).
Thanks in advance!
R.script (saved as "test.R"):
temp <- 12
test.mat <- as.data.frame(matrix(NA,ncol=2,nrow=1))
test.mat$V1 <- 2
test.mat$V2 <- paste(temp,"subjects > 28 days",sep=" ")
> is a mathematical symbol and as so it is not recognized unless it is not embedded in a a mathematical environment (inline or as a bloc.)
Try this code.
$>$
A (not so elegant) solution
The behavior of kable remains strange. After I've analyzed the latex code that it produces I've tried this solution, which is not so elegant, but it works. Hoping that some other users will provide more efficient solutions. Here is my code.
% !Rnw weave = knitr
\documentclass[a4paper]{article}
\begin{document}
<<echo = F, message = FALSE>>=
source("test.R")
aa1
#
\end{document}
where the test.R is:
temp <- 12
test.mat <- as.data.frame(matrix(NA,ncol=2,nrow=1))
test.mat$V1 <- 2
test.mat$V2 <- paste(temp,"subjects > 28 days",sep=" ")
aa <- kable(test.mat, format = "latex")
aa1 <- gsub(">", "$>$", aa)
and here is the result:
I can't explain why it is working now, but here is what I found I should use in the preambel:
\usepackage{lmodern}
\usepackage[T1]{fontenc}
Found this in another thread (not really related to my question), but now I get what I want in the R output (no changes required in the R.script) as well as in the pdf.
According to FAQ.7 and Example.038, I should be able to control my width through global options options(width=40) or chunk options tidy.opts(width.cutoff=40). However, the text still runs off the gray box, and in my current case where I have two-column beamer slides. the source code runs into the next column. Is there anything else I can do besides turning off tidy tidy=FALSE and manually setting the breaks in my code?
Minimal working example:
\documentclass[8pt]{beamer}
\begin{document}
\begin{frame}[fragile]
<<>>=
library(reshape2)
options(width=38)
#
\begin{columns}[t]
\column{.5\textwidth}
<<>>=
dataframe <- data.frame(Column1=1:10,Column2=1:10,Variable=1:10,Value=1:10)
#
\column{.5\textwidth}
<<>>=
dataframe <- melt(dataframe,
id.vars=c("Column1","Column2"),
variable.name="Variable",
value.name="Value")
#
\end{columns}
\end{frame}
\end{document}
Output (problem is that columns run together):
Options should be passed like this:
<<echo=FALSE>>=
opts_chunk$set(comment="", message=FALSE,tidy.opts=list(keep.blank.line=TRUE, width.cutoff=120),options(width=100), cache=TRUE,fig.align='center',fig.height=6, fig.width=10,fig.path='figure/beamer-',fig.show='hold',size='footnotesize', cache=TRUE)
#
And here you specify width.cutoff for code and width for r results.
I am having trouble when using "reverse" assignment operators (->) in a knitr .Rnw file. For example, I have the following simple .Rnw file
\documentclass{article}
\begin{document}
<<test>>=
options(tidy=FALSE, width=50)
1:5 -> a
#
\end{document}
When I use knitr to compile into a pdf, the operator -> has been reversed so the output actually has
1:5 <- a
in it!
how can I change this?
Make tidy=FALSE a knitr chunk option rather than an R option:
\documentclass{article}
\begin{document}
<<test,tidy=FALSE>>=
options(tidy=FALSE, width=50)
1:5 -> a
#
\end{document}
(I don't think tidy=FALSE does anything at all in options(), but I guess it's harmless ...)
For setting tidy=FALSE on a chunk-by-chunk basis, Ben's answer has got you covered.
To reset the option globally, use opts_chunk$set(), like so:
\documentclass{article}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
opts_chunk$set(tidy=FALSE)
#
<<test>>=
1:5 -> a
#
\end{document}
Additionally, as documented here, tidy.opts can give you finer-grained control over many aspects of the knitr's (and ultimately formatR::tidy.source()'s) tidying behavior. Perhaps unfortunately in this case, while you can tell knitr not to replace "=" with "<-" (by doing opts_chunk$set(tidy.opts=list(replace.assign=FALSE))you cannot use that option to control whether "->" is replaced by "<-".
Here's an example that uses tidy.opts
\documentclass{article}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
opts_chunk$set(tidy.opts=list(replace.assign=FALSE))
#
<<test>>=
j <- function(x) { x<-y ## x<-y will be printed on new line, with added inter-token spaces
a = 1:5 ## will be indented, but "=" won't be replaced
} ## closing brace will be moved to start of line
#
\end{document}
I am having trouble when using "reverse" assignment operators (->) in a knitr .Rnw file. For example, I have the following simple .Rnw file
\documentclass{article}
\begin{document}
<<test>>=
options(tidy=FALSE, width=50)
1:5 -> a
#
\end{document}
When I use knitr to compile into a pdf, the operator -> has been reversed so the output actually has
1:5 <- a
in it!
how can I change this?
Make tidy=FALSE a knitr chunk option rather than an R option:
\documentclass{article}
\begin{document}
<<test,tidy=FALSE>>=
options(tidy=FALSE, width=50)
1:5 -> a
#
\end{document}
(I don't think tidy=FALSE does anything at all in options(), but I guess it's harmless ...)
For setting tidy=FALSE on a chunk-by-chunk basis, Ben's answer has got you covered.
To reset the option globally, use opts_chunk$set(), like so:
\documentclass{article}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
opts_chunk$set(tidy=FALSE)
#
<<test>>=
1:5 -> a
#
\end{document}
Additionally, as documented here, tidy.opts can give you finer-grained control over many aspects of the knitr's (and ultimately formatR::tidy.source()'s) tidying behavior. Perhaps unfortunately in this case, while you can tell knitr not to replace "=" with "<-" (by doing opts_chunk$set(tidy.opts=list(replace.assign=FALSE))you cannot use that option to control whether "->" is replaced by "<-".
Here's an example that uses tidy.opts
\documentclass{article}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
opts_chunk$set(tidy.opts=list(replace.assign=FALSE))
#
<<test>>=
j <- function(x) { x<-y ## x<-y will be printed on new line, with added inter-token spaces
a = 1:5 ## will be indented, but "=" won't be replaced
} ## closing brace will be moved to start of line
#
\end{document}