如何导入子文档的环境,而不是输出

时间:2015-04-30 16:39:13

标签: r knitr

我的分析通常是一个长的管道,分成小的Rmarkdown文件,然后我用knitr编译。我经常想在一个(或更多)Rmarkdown文件的末尾开始一个新的Rmd文件;特别是我希望能够得到R环境的结果。但是,我希望最后不要获得一个庞大的文件,但是将每个文件保存为单独的.html文件 - 否则会变得笨拙。 (但我并不担心我必须单独手动运行每一个,不像帖子knitr: Knitting separate Rnw documents within an Rmd document

例如:在数据(A.Rmd)上开发方法A,然后在数据上开发方法B(B.Rmd)。现在比较A和B的结果(CompareAB.Rmd)。通常A.Rmd和B.Rmd都有一些我不想重新运行的长片,所以我也想拉出这两者的缓存,但如果它们没有被运行或者已被更改,我'我希望它重新运行它。另一个例子:我想使用A.Rmd和B.Rmd的结果进行演示(例如乳胶投影仪)。这个想法不只是他们共享公共代码,而是他们有单独的代码,但文件相互依赖。我在下面给出一个简单的示例,下面是父文件和子文件,我在子文件中使用Sys.sleep(10)来轻松检测父文件是否正在使用子文件的缓存或重新计算它。

我认为这样做的显而易见的方法是在某些时候将child=c("A.Rmd","B.Rmd")包含为一个块选项。但是,这有两个问题。 1)它似乎没有拉出子文件的缓存,而是重新计算文件,即使没有任何变化,2)它将所有输出文本和子文件的图形放在我的文件中。

拉取缓存的另一个选择是在子文件的所有缓存(A.Rmd和B.Rmd)上使用lazyLoad(),但这对于它是否达到最高是不明智的日期更改原始文件。这绝对是一个可行的临时黑客,但不是真正的解决方案。然后另一种解决方法是将以后文件中需要的结果保存到文件(.txt或.Rdata)。这绝对是一个解决方案,但可能意味着我最终再次重新运行A.Rmd和B.Rmd文件的长部分,因为我原本不知道我以后想要一个特定的对象所以我不得不改变代码(因此缓存会重新运行)。它还导致许多丑陋的代码编写和阅读,并且不知道结果是否是最新的。所以我想我会检查是否有更优雅的方法来做到这一点(或者这可能会开始成为一个功能请求)。

这似乎有点像How to source R Markdown file like `source('myfile.r')`?中的问题,但问题来自3年前(不清楚是否有子选项),而且似乎他们也不想将缓存拉下来。

这是我的例子。子文件(test.Rmd)将是:

---
title: "Test1"
author: "Me"
date: "April 7, 2015"
output: html_document
---
```{r setup}
knitr::opts_chunk$set(cache=TRUE, cache.path = "child_cache/", fig.path="child_figure/")
```

Some text about child process

```{r run1}
x<-seq(1,10,length=100)
y<-rnorm(n=100)
Sys.sleep(10) #so can easily see whether running caching
plot(x,y,main="Child Plot")
```

下面的我的'父'文件(testParent.Rmd)将使用上面test.Rmd文件中定义的x和y。

---
title: "TestParent"
author: "Me"
date: "April 7, 2015"
output: html_document
---
```{r setupParent}
knitr::opts_chunk$set(cache=TRUE, cache.path = "parent_cache/", fig.path="parent_figure/")
```

```{r bringInChild, child="test.Rmd"}

```

Some text about Parent process

```{r useRun}
x2<-x*1000
y2<-y*1000
plot(x2,y2,main="Parent Plot")
```

0 个答案:

没有答案