How to print a table and figure side-by-side in knitr

I see a lot of posts on putting figures side by side with tables without knitr, and posts about putting tables next to tables and figures next to figures in knitr, but nothing on how to put a figure next to a table in knitr.

Everything I try give an 'Not in outer par mode' error.

A simple example is below. I would like the graphic and text to appear side by side, and so not take up so much vertical space.

Thanks in advance for any help.

\documentclass{article}

\begin{document}
<<Setup, echo=F, message=F>>=
opts_chunk\$set(echo=F, message=F)
@

Some text.

<<MyTable, results='asis'>>=
library(xtable)
my.data <- data.frame(x=runif(10), y=runif(10))
xtable(my.data, caption="My table")
@

<<MyGraph, out.width='3in', out.height='3in', fig.width=3, fig.height=3>>=
library(ggplot2)
qplot(x=runif(50), y=runif(50)) + ggtitle("My graph")
@

Some text.

\end{document}


\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

\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}
\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}%
\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}%
\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}%
\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}%
\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}%
\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}%
\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}%
\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}%
\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}%

\usepackage{framed}
\makeatletter
\newenvironment{kframe}{%
\def\at@end@of@kframe{}%
\ifinner\ifhmode%
\def\at@end@of@kframe{\end{minipage}}%
\begin{minipage}{\columnwidth}%
\fi\fi%
\def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep
% There is no \\@totalrightmargin, so:
\hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
\@totalleftmargin\z@ \linewidth\hsize
\@setminipage}}%
{\par\unskip\endMakeFramed%
\at@end@of@kframe}
\makeatother

\definecolor{messagecolor}{rgb}{0, 0, 0}
\definecolor{warningcolor}{rgb}{1, 0, 1}
\definecolor{errorcolor}{rgb}{1, 0, 0}
\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX

\usepackage{alltt}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
\begin{knitrout}

\end{knitrout}

Some text.

\begin{kframe}
\begin{alltt}
\hlkwd{library}\hlstd{(xtable)}
\hlstd{my.data} \hlkwb{<-} \hlkwd{data.frame}\hlstd{(}\hlkwc{x}\hlstd{=}\hlkwd{runif}\hlstd{(}\hlnum{10}\hlstd{),} \hlkwc{y}\hlstd{=}\hlkwd{runif}\hlstd{(}\hlnum{10}\hlstd{))}
\hlkwd{xtable}\hlstd{(my.data,} \hlkwc{caption}\hlstd{=}\hlstr{"My table"}\hlstd{)}
\end{alltt}
\end{kframe}% latex table generated in R 3.0.2 by xtable 1.7-3 package
% Mon Oct 13 22:04:21 2014
\begin{table}[ht]
\centering
\begin{tabular}{rrr}
\hline
& x & y \\
\hline
1 & 0.51 & 0.94 \\
2 & 0.02 & 0.63 \\
3 & 0.40 & 0.15 \\
4 & 0.41 & 0.22 \\
5 & 0.10 & 0.03 \\
6 & 0.63 & 0.41 \\
7 & 0.63 & 0.43 \\
8 & 0.61 & 0.16 \\
9 & 0.06 & 0.62 \\
10 & 0.15 & 0.20 \\
\hline
\end{tabular}
\caption{My table}
\end{table}

\begin{knitrout}
\begin{alltt}
\hlkwd{library}\hlstd{(ggplot2)}
\hlkwd{qplot}\hlstd{(}\hlkwc{x}\hlstd{=}\hlkwd{runif}\hlstd{(}\hlnum{50}\hlstd{),} \hlkwc{y}\hlstd{=}\hlkwd{runif}\hlstd{(}\hlnum{50}\hlstd{))} \hlopt{+} \hlkwd{ggtitle}\hlstd{(}\hlstr{"My graph"}\hlstd{)}
\end{alltt}
\end{kframe}
\includegraphics[width=3in,height=3in]{figure/MyGraph}

\end{knitrout}

Some text.

\end{document}

• for those of us without knitr can you show the latex file that generates? presumably it has a figure environment nested inside some kind of box (which generates the not in outer par error) but it's hard to say from the above – David Carlisle Oct 11 '14 at 12:03

Try placing the corresponding code into a single chunk and use fig.show='hold'. See details in this answer by @Yihui, knitr's creator: https://tex.stackexchange.com/a/117872/48376.