【问题标题】:Modify external R script in a knitr chunk修改 knitr 块中的外部 R 脚本
【发布时间】: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 &lt;- 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 &lt;- CarPlot + ggtitle("Plot about cars") 行中的以下块中。如果您从test.R 中删除CarPlot 行,并将其添加到CarPlot 块的末尾会怎样?
  • @DavidRobinson 是的,我明白这一点。我想问的是,是否有一种方法可以在 CarPlot 之前有效地运行 CarPlot &lt;- CarPlot + ggtitle("Plot about cars") 而无需在外部 R 文件中明确地执行此操作。

标签: r knitr rnw


【解决方案1】:

您不想显示由test.R 创建的绘图,因此您应该为该块设置fig.show = 'hide'include = FALSE

<<external-code, cache=FALSE,echo=FALSE,fig.show = 'hide'>>=
read_chunk('./test.R')
@

确实想显示修改后的情节,所以你必须打印出来:

<<CarPlot,echo=FALSE>>=
CarPlot <- CarPlot + ggtitle("Plot about cars")
CarPlot
@

fig.show = 'hold' 用于如果您有一个大代码块在中间打印一个图,但您不希望该图在文档中显示到最后。不适用于本案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    相关资源
    最近更新 更多