2

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

我的想法是将绘图代码移动到一个组中,该组仅在代码在上层执行时运行,并且在代码由另一个 R 脚本提供时不运行,通过source()习语。这可能吗?

我发现了这个旧的 SO 问题,但是在我的情况下interactive()总是TRUE如此,所以接受的答案不起作用。

我的情况如下:我有一个文件 ,并通过将其从 发送到myKnit.rnw运行它,使用. 因此,总是将是,并且将是非零的——因为它基本上是通过应用到临时文件来工作的。 vimRvim-r-plugininteractive()TRUElength(sys.frames())vim-r-pluginbase::source(...)

我正在寻找的解决方案R相当于pythonidiom if __name__ == __main__

因此,当通过myKnit.rnw运行和获取源myscript.rsource("~/R/myscript.r")if计算FALSE结果和绘图代码myscript.r不会运行。

在 python 术语中,__name__(或我们称之为的任何东西)在 sources 时不会是__main__myKnit.rnw但当myscript.rmyscript.rvim.

示例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}

这是来源的情节脚本:

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

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

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

fromSource <- function()
{
    knitSysSwitch <- function()
    { 
        switch(Sys.info()[['sysname']], 
               Windows = 'source', 
               Darwin = 'base::source')
    }
    length(sys.frame()) >= 4 && sys.call(1)[[1]] == knitSysSwitch()
}
4

1 回答 1

2

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

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

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

顺便说一句,也许你知道这一点:当你在工作时knitr,你可以使用 chunk 选项打开缓存cache=TRUE来加速耗时的绘图代码。

于 2013-08-05T20:09:42.720 回答