在R中脚本化的主要行为?
使用在R中脚本化的主要行为?,r,knitr,scriptedmain,R,Knitr,Scriptedmain,使用knitr带来了一个新问题——我的许多R脚本都包含图片生成代码,当我编写代码时,绘图代码会减慢速度 我的想法是将绘图代码移动到一个组中,该组仅在代码在较高级别执行时运行,而不是在代码由另一个R脚本通过source()惯用语来源时运行。这可能吗 我发现了一个古老的SO问题,但是在我的情况下,interactive()将始终是TRUE,因此接受的答案不起作用 我的案例如下:我有一个文件,myKnit.rnw,通过使用vim-R-plugin将它从vim发送到R来运行它。因此,interactiv
knitr
带来了一个新问题——我的许多R
脚本都包含图片生成代码,当我编写代码时,绘图代码会减慢速度
我的想法是将绘图代码移动到一个组中,该组仅在代码在较高级别执行时运行,而不是在代码由另一个R脚本通过source()
惯用语来源时运行。这可能吗
我发现了一个古老的SO问题,但是在我的情况下,interactive()
将始终是TRUE
,因此接受的答案不起作用
我的案例如下:我有一个文件,myKnit.rnw
,通过使用vim-R-plugin
将它从vim
发送到R
来运行它。因此,interactive()
总是TRUE
,length(sys.frames())
将是非零的——因为vim-r-plugin
基本上是通过将base::source(…)
应用到临时文件来工作的
我正在寻找的解决方案是一个R
等价于python
习惯用法if\uuuuu name\uuu==\uuuu main\uuu
因此,当运行myKnit.rnw
并通过source(“~/r/myscript.r”)
来源代码myscript.r
时,if
的计算结果为FALSE
,而myscript.r
中的绘图代码不会运行
用python术语来说,\uuuuuu name\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
示例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}
\documentclass{beamer}
\开始{document}
\标题{最小示例}
\作者{ricardo}
\maketitle
\开始{frame}[易碎]
源代码,然后使用绘图
=
源(“~/rwd/plotScript.r”)
@
直方图!
=
印刷品(pp)
@
\结束{帧}
\结束{document}
这是来源于以下的情节脚本:
require(ggplot2)
set.seed(1)
x <- rnorm(100)
pp <- qplot(x, geom = 'histogram')
pdf("seed1Hist.pdf")
print(pp)
dev.off()
require(ggplot2)
种子(1)
x我想你在寻找这样的东西:
if (length(sys.frames()) >= 4 && sys.call(1)[[1]] == quote(base::source)) {
# plot them
}
通过source()
计算代码时,堆栈中至少有四个帧sys.call()[[1]]
在调用中提取函数符号,我认为这类似于Python中的\uuuu name\uuuu
顺便说一句,也许您知道这一点:当您在knitr
中工作时,您可以使用chunk选项cache=TRUE
打开缓存,以加快耗时的绘图代码。您能给我们展示一个生成此代码的.rnw文件的最小示例吗?让每个人都从同一个例子中学习会使事情变得简单。@Thomas,请原谅——我只是在家里用mac做了一个简单的例子,没有任何问题。。。这表明要么是windows的问题,要么是代码有其他问题。我会在工作中检查并确认——否则我会删除这个问题。@Thomas,我在家里的mac电脑上仔细查看了一些东西,虽然没有出现错误,但问题仍然是大量绘图代码会使速度减慢很多(特别是使用ggplot2
),因此解决方法仍然非常可取。进行了一个小的编辑,以反映已更改的catalyst和添加的示例代码。+1,接受。我在mac
和windows
之间工作,并且vim-r-plugin
的source
行为各不相同,因此我添加了以下助手knitSysSwitch=4&&sys.call(1)[[1]==knitSysSwitch())
@ricardo或将所有内容包装成一个函数,例如if(from_source()){plot…
,和from_source=function(){…Sys.info()…Sys.call()…which…}
if (length(sys.frames()) >= 4 && sys.call(1)[[1]] == quote(base::source)) {
# plot them
}