Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中脚本化的主要行为?_R_Knitr_Scriptedmain - Fatal编程技术网

在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
}