gpt4 book ai didi

r - knitr 图、标签和标题在一个 block 中

转载 作者:行者123 更新时间:2023-12-04 02:15:11 27 4
gpt4 key购买 nike

我正在生成一个 latex 报告,它在 dlply 调用中生成多个图。 dlply 调用当然是在一个单独的块中,为了让标签和标题发生变化,我使用了来自 Steve Powell 的片段。以下。该方法有效,但似乎 knitr 并没有正确格式化输出。一个简单的例子说明:

\documentclass{article}

\begin{document}
<startup,echo=FALSE,results='hide',message=FALSE,tidy=FALSE,warning=FALSE,fig.keep='all',comment=NA>>=
require(knitr)
require(ggplot2)
opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA,
tidy=FALSE,
warning=FALSE,
message=FALSE,
echo=FALSE,
dpi=600,
fig.width=6.75, fig.height=4, # Default figure widths
dev=c("pdf",'tiff'),
dev.args=list(pdf=list(NULL),tiff=list(compression='lzw')),
error=FALSE)
@
<<plotloop,results='asis'>>=
for(x in seq(1,20)){
x1<-data.frame(x=seq(1,10),y=seq(1,10))
plt<-ggplot(data=x1,aes(x,y))+geom_point()
figLabel=paste('Figure',x,sep='')
capt<-paste('Caption for fig.',x)
cat(knit(text=(paste("<<",figLabel,",fig.pos='ht',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
}
@
\end{document}
这几乎有效。问题是 knitr 将关闭的\caption 大括号放在\label 大括号之外,这可以在下面的 .tex 文件的片段中看到:
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}
\color{fgcolor}
\begin{figure}[ht]
\includegraphics[width=\maxwidth]{figure/Figure1} \caption[Caption for fig]{Caption for fig. 1\label{fig:Figure1}}
\end{figure}
\end{knitrout}
如果只有几个这样的数字, latex 可以处理这个问题,但如果有大量的图,它就会开始错误地放置它们。
我也试过这个
fig.cap=paste('testLoop',seq(1,20))
接近并得到相同的结果。
进一步说明:我在 wikipedia's Latex/Floats... 上找到了这个页:

If you want to label a figure so that you can reference it later, you have to add the label after the caption (inside seems to work in LaTeX 2e) but inside the floating environment. If it is declared outside, it will give the section number.


“内部似乎在 LaTeX 2e 中工作”部分引起了我的注意。似乎它只是因为错误被忽略了很多次才起作用?我在用
LaTeX2e <2005/12/01>。
我认为代码位在 hooks-latex.R 的 hook_plot_tex 函数第 120 行:
fig2 = sprintf('\\caption%s{%s\\label{%s}}\n\\end{%s}\n', scap, cap,
paste(lab, if (mcap) fig.cur, sep = ''), options$fig.env)
这能解决吗?
fig2 = sprintf('\\caption%s{%s}\\label{%s}\n\\end{%s}\n', scap, cap,
paste(lab, if (mcap) fig.cur, sep = ''), options$fig.env)
建议?我对github流程不熟悉...
谢谢!

最佳答案

简短的回答是它似乎是由太多\includegraphics 命令和没有分页符引起的 LaTeX 问题。从循环内完成多个带有标题和标签的数字的函数(归功于 Steve Powell 和 Yihui):

plot.knit<-function(chunkLabel,#text for chunk label which is also used for figure file name
capt,#text for caption
plt)#plot object to be placed
{
cat(knit(text=(paste("<<",chunkLabel,",fig.pos='h',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
}
cat('\\newpage')#some sort of page break must be inserted along the way to keep latex from breaking.
可以修改它以添加您想要的任何块选项。
长答案:
这是我为使其正常工作所做的工作。我从 github 下载了 knitr,进行了上面建议的更改,编译并运行了示例。修改后的代码并没有改变结果。对 latex 错误的进一步调查将我带到了 LaTeX FAQ它指出:

The error also occurs in a long sequence of float environments, with no intervening text. Unless the environments will fit “here” (and you’ve allowed them to go “here”), there will never be a page break, and so there will never be an opportunity for LaTeX to reconsider placement. (Of course, the floats can’t all fit “here” if the sequence is sufficiently prolonged: once the page fills, LaTeX won’t place any more floats, leading to the error.

Techniques for resolution may involve redefining the floats using the float package’s [H] float qualifier, but you are unlikely to get away without using \clearpage from time to time.


所以,我补充说
cat('\\clearpage')
在循环的每个步骤中生成图之后。这导致没有抛出错误并且数字位于正确的位置。还,
cat('\\newpage')
工作并且似乎在将数字 2 放在我的实际文档中的页面上做得更好。
工作代码:
\documentclass{article}

\begin{document}
<<startup,echo=FALSE,results='hide',message=FALSE,tidy=FALSE,warning=FALSE,fig.keep='all',comment=NA>>=
require(knitr)
require(ggplot2)
opts_knit$set(progress = F, verbose = F)
opts_chunk$set(comment=NA,
tidy=FALSE,
warning=FALSE,
message=FALSE,
echo=FALSE,
dpi=600,
fig.width=6.75, fig.height=4, # Default figure widths
dev=c("pdf",'tiff'),
dev.args=list(pdf=list(NULL),tiff=list(compression='lzw')),
error=FALSE)
@
<<plotloop,results='asis'>>=
for(x in seq(1,20)){
x1<-data.frame(x=seq(1,10),y=seq(1,10))
plt<-ggplot(data=x1,aes(x,y))+geom_point()
figLabel=paste('Figure',x,sep='')
capt<-paste('Caption for fig.',x)
cat(knit(text=(paste("<<",figLabel,",fig.pos='h',fig.cap='",capt,"'>>=\nplt\n@",sep=''))))
cat('\\newpage')
}
@

\end{document}

关于r - knitr 图、标签和标题在一个 block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21685885/

27 4 0