R中的脚本主要行为?

时间:2013-08-03 06:12:59

标签: r knitr scriptedmain

使用knitr引入了一个新问题 - 我的许多R脚本都包含图片生成代码,而当我获取代码时,绘图代码会减慢速度。

我的想法是将绘图代码移动到一个组中,该组仅在代码在较高级别执行时运行,而在代码由另一个R脚本通过source()惯用语源代码时不运行。这可能吗?

我发现了this旧问题,但interactive()在我的案例中始终为TRUE,因此接受的答案不起作用。

我的情况如下:我有一个文件myKnit.rnw,并使用vimR发送到vim-r-plugin来运行它。因此,interactive()始终为TRUElength(sys.frames())将为非零 - 因为vim-r-plugin基本上可以通过将base::source(...)应用于临时文件。

我正在寻找的解决方案是与R成语python等效的if __name__ == __main__

因此当myKnit.rnw通过myscript.r运行source("~/R/myscript.r")时,if评估为FALSEmyscript.r中的绘图代码不会跑。

在python术语中,当__name__来源__main__时,myKnit.rnw(或我们称之为的任何内容)不会是myscript.r,但是当我发送{{1}时,它将是真的从myscript.r到控制台。

示例vim代码:

knitr

这是源于的剧情剧本:

\documentclass{beamer}
\begin{document}
\title{A Minimal Example}
\author{ricardo}

\maketitle

\begin{frame}[fragile]
source the code and then use the plot

<<source_plotScript, include=FALSE>>=
source("~/rwd/plotScript.r")
@
a histogram!
<<histy, fig.width=7, fig.height=5, messages=FALSE, warnings=FALSE>>=
print(pp)
@
\end{frame}
\end{document}

具有系统特定标志的解决方案,反映了Yihui的评论

require(ggplot2)
set.seed(1)
x <- rnorm(100)
pp <- qplot(x, geom = 'histogram')

pdf("seed1Hist.pdf")
print(pp)
dev.off()

1 个答案:

答案 0 :(得分:2)

我猜你正在寻找这样的东西:

if (length(sys.frames()) >= 4 && sys.call(1)[[1]] == quote(base::source)) {
  # plot them
}

当通过source()评估代码时,堆栈中至少有四个帧。 sys.call()[[1]]提取调用中的函数符号,我认为它类似于Python中的__name__

BTW,也许您已经意识到这一点:当您在knitr工作时,可以使用块选项cache=TRUE打开缓存,以加快耗时的绘图代码。