knitr绘制代码块以供查看和运行

时间:2013-08-05 23:30:57

标签: r knitr

我一直在尝试使用knitr来解决以下问题。 在\LaTeX我希望定义一个名为myplot的块(一次)。 然后我想说点如下:

代码

<<myplot, tidy = FALSE>>=
plot(runif(9), runif(9),
     xlab = "x",
     ylab = "y",)
@

结果为Figure~\ref{fig:myownlabel}

\begin{figure}[hh]
\begin{center}
<<myplotfig, out.width='.50\\linewidth', width=6.6, height=4.8, echo=FALSE>>=
par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
<<myplot>>
@
\caption{
I insist to have the caption in \LaTeX.
\label{fig:myownlabel}
}
\end{center}
\end{figure}

我知道如何在Sweave中执行此操作但似乎无法在knitr中执行此操作。 也就是说,读取器可以看到代码块。 你能给我任何建议吗? 提前致谢。 托马斯

1 个答案:

答案 0 :(得分:4)

这是knitr和Sweave之间的一个区别:默认情况下,Sweave不会保留图表(除非您指定fig=TRUE),但knitr会这样做(除非您真的不想要它们,使用fig.keep='none')。

<<myplot, tidy = FALSE, fig.keep = 'none'>>=
plot(runif(9), runif(9),
     xlab = "x",
     ylab = "y",)
@

\begin{figure}[hh]
\begin{center}
<<myplotfig, out.width='.50\\linewidth', fig.width=6.6, fig.height=4.8, echo=FALSE>>=
par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
<<myplot>>
@
\caption{
I insist to have the caption in \LaTeX.
\label{fig:myownlabel}
}
\end{center}
\end{figure}

虽然到目前为止问题已经解决,但我还有一些其他意见:

  1. 当您使用knitr>= 1.1)时,您应该能够看到有关代码块语法的警告,并且您需要致电Sweave2knitr()来解决问题;您会发现widthheightknitr中不是有效的块选项(使用fig.widthfig.height);见here for more information
  2. 对于块myplot,我会使用eval=FALSE,因为您可能不想两次评估代码;
  3. 使用knitr
  4. ,您实际上可以通过块选项执行所有操作,例如

    <<myplot, tidy=FALSE, eval=FALSE, echo=-1>>=
    @
    <<myplot, out.width='.5\\linewidth', fig.width=6.6, fig.height=4.8, fig.align='center', echo=FALSE, fig.pos='hh', fig.cap='I insist to have the caption in \\LaTeX.'>>=
    par(las = 1, mfrow = c(1, 1), mar = c(5, 4, 1, 1)+0.1)
    plot(runif(9), runif(9),
         xlab = "x",
         ylab = "y",)
    @
    

    这为您提供centerfigure环境,并自动生成标签fig:myplot