使用knitr
引入了一个新问题 - 我的许多R
脚本都包含图片生成代码,而当我获取代码时,绘图代码会减慢速度。
我的想法是将绘图代码移动到一个组中,该组仅在代码在较高级别执行时运行,而在代码由另一个R脚本通过source()
惯用语源代码时不运行。这可能吗?
我发现了this旧问题,但interactive()
在我的案例中始终为TRUE
,因此接受的答案不起作用。
我的情况如下:我有一个文件myKnit.rnw
,并使用vim
从R
发送到vim-r-plugin
来运行它。因此,interactive()
始终为TRUE
,length(sys.frames())
将为非零 - 因为vim-r-plugin
基本上可以通过将base::source(...)
应用于临时文件。
我正在寻找的解决方案是与R
成语python
等效的if __name__ == __main__
。
因此当myKnit.rnw
通过myscript.r
运行source("~/R/myscript.r")
时,if
评估为FALSE
而myscript.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()
答案 0 :(得分:2)
我猜你正在寻找这样的东西:
if (length(sys.frames()) >= 4 && sys.call(1)[[1]] == quote(base::source)) {
# plot them
}
当通过source()
评估代码时,堆栈中至少有四个帧。 sys.call()[[1]]
提取调用中的函数符号,我认为它类似于Python中的__name__
。
knitr
工作时,可以使用块选项cache=TRUE
打开缓存,以加快耗时的绘图代码。