[Tex/LaTex] How to print a table and figure side-by-side in knitr

floatsknitrpositioningsubfloatsxtable

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
 \colorbox{shadecolor}{##1}\hskip-\fboxsep
     % There is no \\@totalrightmargin, so:
     \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
 \MakeFramed {\advance\hsize-\width
   \@totalleftmargin\z@ \linewidth\hsize
   \@setminipage}}%
 {\par\unskip\endMakeFramed%
 \at@end@of@kframe}
\makeatother

\definecolor{shadecolor}{rgb}{.97, .97, .97}
\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}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}


{\ttfamily\noindent\bfseries\color{errorcolor}{\#\# Error: object 'chunk' not found}}\end{kframe}
\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}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\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}

Best Answer

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.