假设我有一个外部R脚本external.R
:
df.rand <- data.frame(rnorm(n = 100), rnorm(n = 100))
然后还有一个
main.Rmd
:\documentclass{article}
\begin{document}
<<setup, include = FALSE>>=
library(knitr)
library(ggplot2)
# global chunk options
opts_chunk$set(cache=TRUE, autodep=TRUE, concordance=TRUE, progress=TRUE, cache.extra = tools::md5sum("external.r"))
@
<<source, include=FALSE>>=
source("external.R")
@
<<plot>>=
ggplot(data = df.rand, mapping = aes(x = x, y = y)) + geom_point()
@
\end{document}
将这些内容放在一个外部脚本中很有帮助,因为实际上,这是一堆导入、数据清理和模拟任务,会使main.Rmd
变得混乱。
main.Rmd
中的任何代码块都依赖于外部脚本的更改。
为了解决这个依赖关系,我添加了上面的cache.extra = tools::md5sum("external.r")
。
看起来这样做还不错。
我正在寻找最佳实践。
- 这样做足够健壮吗?
- 有没有更加优雅的方法?(例如,遗憾的是,外部.R中的任何更改都会触发完全的缓存失效,而不仅仅是使那些实际上更改的对象失效。)
除了一些library()
调用之外,这里没有副作用,但我可以将它们移到main.Rmd
中。
我总是担心我可能做错了什么。
external.R
的结果是什么?只创建了对象df.rand
还是还有更多的对象或副作用? - CL.df.rand
。据我所知,唯一的副作用是一些library()
调用(我可以/应该将其移动到main.Rmd
中)。顺便说一句,有没有一个 R 函数可以测试副作用? - maxheld