【发布时间】:2015-08-19 19:49:06
【问题描述】:
我想知道是否可以挂钩到knitr 读取的外部 R 脚本中的代码。
具体来说说你有以下R文件
test.R
## ---- CarPlot
library(ggplot2)
CarPlot <- ggplot() +
stat_summary(data = mtcars,
aes(x = factor(gear),
y = mpg
),
fun.y = "mean",
geom = "bar"
)
CarPlot
假设您想在多个报告中使用此图表,但在其中一个报告中您希望图表有标题,而在另一个报告中却没有。
理想情况下,我希望能够使用相同的外部 R 脚本来执行此操作,以便在我决定更改图表的某些内容时不必更改多个 R 文件。
我认为可能的一种方法是将fig.show 块选项设置为hold——因为它会“hold all plots and output them in the very end of a code chunk”——然后像这样在情节中附加一个标题:
test.Rnw
\documentclass{article}
\begin{document}
<<external-code, cache=FALSE,echo=FALSE>>=
read_chunk('./test.R')
@
<<CarPlot,echo=FALSE,fig.show='hold'>>=
CarPlot <- CarPlot + ggtitle("Plot about cars")
@
\end{document}
但是,这不起作用。虽然打印了情节,但我尝试附加的标题没有显示出来。
有什么方法可以做我想做的事吗?
【问题讨论】:
-
“不起作用”是一个糟糕的描述符。如果您的意思是您没有看到绘图,那是因为该代码不会正常打印绘图,就像
x <- 1不打印x一样。您需要显式地print(CarPlot),或者在修改后直接在一行上调用CarPlot。不需要设置fig.show。 -
@Gregor 它显示了情节,但情节没有我试图在
.Rnw文件中附加的标题。如果您查看test.R文件,您会发现在一行中确实存在对CarPlot的调用。我不明白fig.show='hold'是如何工作的,但我认为它可能会阻止该行执行到块结束(基于其功能的描述),从而允许我附加标题。 -
所以,最后,这归结为 R FAQ 7.22 as seen here
-
@AdamLiter 在
test.R中有一个对CarPlot的调用,但所有这些都发生在之前你的CarPlot <- CarPlot + ggtitle("Plot about cars")行中的以下块中。如果您从test.R中删除CarPlot行,并将其添加到CarPlot块的末尾会怎样? -
@DavidRobinson 是的,我明白这一点。我想问的是,是否有一种方法可以在
CarPlot之前有效地运行CarPlot <- CarPlot + ggtitle("Plot about cars")而无需在外部 R 文件中明确地执行此操作。