2013-08-05 52 views
3

我一直在嘗試使用knitr解決以下問題。 在\LaTeX我希望定義一個名爲myplot的塊(一次)。 然後我想說的東西如:Figure~\ref{fig:myownlabel}knitr繪圖代碼塊被看到和運行

代碼

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

結果。

\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。 也就是說,代碼塊被讀者看到。 你能給我什麼建議嗎? 在此先感謝。 托馬斯

+0

非常感謝Yihui爲您的快速反應,它解決了我的問題。我很滿意現在的東西:) –

回答

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,你實際上可以通過塊選項來做所有事情,例如,

    <<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

+0

你是否使用嵌套塊來獲得格式化的代碼? – agstudy

+0

@agstudy嵌套塊用於重複使用代碼,因此您不必在兩個塊上重複一些代碼:http://yihui.name/knitr/demo/reference/ –

+0

謝謝!優秀!我問過這個問題,因爲當我嘗試你的代碼時,代碼很好地縮進了。附註您是否完成了關於'knitr'的書? – agstudy