【发布时间】:2020-12-12 23:13:59
【问题描述】:
我正在尝试使用 Sweave 或 Knitr 生成包含绘图的文档。
这是 Sweave 的一个最小示例:
\documentclass{article}
\title{Plot example}
\begin{document}
\maketitle
<<setup>>=
library("graphics")
myplot = function(n) {
plot(cumsum(rnorm(n)),type="l",main="The stock market",ylab="Money",xlab="Time")
}
@
This is what the stock market looks like over the past month:
\begin{center}
<<fig=T,echo=F,width=10,height=4>>=
myplot(10)
@
\end{center}
and over the past decade:
\begin{center}
<<fig=T,echo=F,width=10,height=4>>=
myplot(1000)
@
\end{center}
\end{document}
Knitr 版本的块头略有不同:
<<echo=F,fig.width=10,fig.height=4>>=
输出如下:
在这两种情况下,图的宽度和高度都在源文件中进行了硬编码。在我看来,这就像糟糕的软件设计。我更愿意在函数myplot() 中指定绘图的宽度和高度。否则,如果我想改变绘图的外观,或者我想从信纸切换到 A4 纸,那么我需要使用搜索和替换来更改几个硬编码的宽度和高度值。
在Knitr中,可以通过R代码改变默认的宽高:
<<cache=FALSE>>=
opts_chunk$set(fig.width=3,fig.height=4);
@
但是,此配置必须与执行绘图的代码块分开,因为 Knitr(如 Sweave)在评估任何块代码之前会打开绘图设备。我需要的是一种在myplot() 中指定高度和宽度的方法。
在 Sweave 或 Knitr 中指定绘图宽度和高度以及绘图的其余部分的优雅方法是什么?
【问题讨论】:
-
块选项可以将任意 R 表达式作为其值。这些值不必是硬编码的(例如数字)。更多信息在这里:bookdown.org/yihui/rmarkdown-cookbook/chunk-variable.html 也就是说,我认为不可能从
myplot()内部更改选项值,因为那为时已晚(knitr 必须打开图形设备在评估代码块之前,需要在那时指定大小)。
标签: r plot knitr sweave literate-programming