knitr:添加到新代码块中的上一个绘图

时间:2017-12-10 06:32:39

标签: r knitr

我使用R的4 4 8 包生成一个LaTeX文档,将文本与嵌入的R图和输出结合起来。

通常写这样的东西:

knitr

工作正常。 (对于那些不熟悉We plot y vs x in a scatter plot and add the least squares line: <<scatterplot>>= plot(x, y) fit <- lm(y~x) abline(fit) @ knitr的人,这会在LaTeX逐字环境中回显代码和输出,并将完成的绘图添加为LaTeX文档中的图形。)

但现在我想写更详细的逐行评论,如:

Sweave

问题是现在有两个First we plot y vs x with a scatterplot: <<scatterplot>>= plot(x, y) @ Then we regress y on x and add the least squares line to the plot: <<addline>>= fit <- lm(y~x) abline(fit) @ 代码块用于同一个图。第二个代码块knitr失败,因为第一个代码块addline中创建的绘图框对第二个代码块中的代码不可见。从一个代码块到下一个代码块,绘图窗口似乎不是持久的。

有什么方法可以让scatterplot保持knit()创建的绘图窗口对第二个代码块保持活动状态?

如果无法做到这一点,我怎样才能在添加到现有图表的代码行上获得LaTeX风格的评论?

一天后

我现在可以看到之前已经提出过基本相同的问题,请参阅: 从2013年开始How to build a layered plot step by step using grid in knitr? {2016年Splitting a plot call over multiple chunks。 2013年的另一个问题也非常相似: How to add elements to a plot using a knitr chunk without original markdown output?

2 个答案:

答案 0 :(得分:4)

您可以设置knitr::opts_knit$set(global.device = TRUE),这意味着所有代码块共享同一个全局图形设备。一个完整的例子:

\documentclass{article}

\begin{document}
<<setup, include=FALSE>>=
knitr::opts_knit$set(global.device = TRUE)
@

First we plot y vs x with a scatterplot:
<<scatterplot>>=
x = rnorm(10); y = rnorm(10)
plot(x, y)
@
Then we regression y and x and add the least square line to the plot:
<<addline>>=
fit <- lm(y~x)
abline(fit)
@

\end{document}

答案 1 :(得分:3)

您可以通过添加块选项eval=FALSE来显示代码而无需对其进行评估。如果您只想显示添加了回归线的绘图的最终版本,请使用eval=FALSE作为第一个plot(x,y)

然后我们为回归线添加两个块:一个是渲染绘图所需的完整代码,但我们不想显示此代码,因为我们不想重复{{ 1}}打电话。因此,我们添加了第二个我们回显的块,以显示代码,但不进行评估。

plot(x,y)

这是输出文档的样子:

enter image description here