我试图使用循环在一个knitr块中生成多个图。这不是很难,我只需要在print()语句中包装每个绘图,knitr会自动生成适当的文件名,例如: chunkname1.pdf,chunkname2.pdf ...
但是,我的情节高度差异很大,我需要为每个情节指定fig.height
。没问题,我只需指定一个高度向量(例如fig.height=c(7,9)
)。在这种情况下,knitr不那么明智地产生两个具有相同文件名的图形(最后一个覆盖第一个)。与Yihui's hack一致,我决定用fig.ext=paste0(c("A","B"),".pdf")
对这两个案例进行矢量化。这种作品有效并产生高度为7的高度chunkname1.A.pdf
和高度为9的chunkname2.B.pdf
(它还会产生高度为9的chunkname1.B.pdf
和高度为7的chunkname2.A.pdf
。
更糟糕的是,在后一种情况下,生成的tex输出错误地引用了chunkname1
和chunkname2
,这当然无法找到。在Yihui的黑客中,他直接通过黑客名字引用生成的文件,这是我不在乎的事情。
那么,处理这个问题的“正确”方法是什么?文档让我相信fig.height
在图形上进行了矢量化,但现在我看到它只是指输出设备,文件扩展名/路径等的组合,用于生成多个不同版本的相同情节。但是,即使knitr支持每个块的多个绘图,它也无法为指定本质上不同的绘图的不同属性提供任何帮助。
这让我得出两个结论之一:
应避免每个块的多个绘图,除非在简单的情况下(更喜欢在单独的块中指定绘图,并使用适当的块选项)。
knitr可以通过对每个块的块选项和/或唯一图形进行矢量化来改进;例如正如我天真地预料的那样,fig.height=c(7,9)
会将chunkname1.pdf的大小设为7,将chunkname2.pdf设置为9。如何做到这一点(基于我对output.R)的粗略检查,或者是否可能,我不清楚。
选项1显然存在缺陷(在我的用例中,我只在运行时指定了图或模型的数量,并且我想避免一系列缺失的绘图错误)。选项2似乎是更多R-ish做事的方式,如果不是不可能出于模糊的原因。那么,有没有办法在不同高度的每个块上完成多个绘图,或者这是knitr的bug / feature请求?