【发布时间】:2015-10-21 21:48:42
【问题描述】:
目标
我想通过使块依赖于所有先前的块来创建可重现的数据分析。因此,如果有 3 个块并且我在第一个块中更改了某些内容,那么后续的 2 个块应该重新运行,以便它们反映在输出中所做的更改。我想在文档顶部的全局块选项中添加这个条件,这样我就不必多次使用dependson。
问题
如果没有修改和cache=TRUE,块的输出不会改变。对于包含代码的块,我可以使用文档顶部的以下内容使它们依赖于所有以前的块:
```{r setup, echo=FALSE}
# set global chunk options:
library(knitr)
opts_chunk$set(cache=TRUE, autodep = TRUE)
dep_auto()
```
如果上述任何块发生更改,则所有后续块都将重新运行。但是,如果我在块中使用 source() 来读取 R 脚本,这将不起作用。以下是一个示例文档:
---
title: "Untitled"
output: html_document
---
```{r setup, echo=FALSE}
# set global chunk options:
library(knitr)
opts_chunk$set(cache=TRUE, autodep = TRUE)
dep_auto()
```
# Create Data
```{r}
#source("data1.R")
x <- data.frame(col1 = 4:10, col2 = 6:12)
x
```
# Summaries
```{r}
#source("data2.R")
median1.of.x <- sapply(x, function(x) median(x)-1)
sd.of.x <- sapply(x, sd)
plus.of.x <- sapply(x, function(x) mean(x)+1)
jj <- rbind(plus.of.x, sd.of.x, median1.of.x)
```
```{r}
jj
```
现在,如果我更改前 2 个块中的任何一个,第三个块在 knitting 之后会给出正确的输出。但是,如果我将第一个块的代码放在源文件data1.R 中,将第二个块的代码放在文件data2.R 中,保持全局块选项与以前相同,如果我对源文件进行任何更改,它们不会反映在第三块正确。例如,将 x 更改为 x <- data.frame(col1 = 5:11, col2 = 6:12) 应该会产生:
> jj
col1 col2
plus.of.x 9.000000 10.000000
sd.of.x 2.160247 2.160247
median1.of.x 8.000000 9.000000
但是如上所述使用source(),knitr 文档报告:
jj
## col1 col2
## mean.of.x 5.000000 9.000000
## sd.of.x 2.160247 2.160247
## minus.of.x 6.000000 10.000000
我需要更改哪些设置才能在knitr 文档中正确使用source?
【问题讨论】:
-
当您使用
source方法时,您将注释掉x <- data.frame()行,对吗? -
Knitr 不太适合实现这一点所需的声明式工作流程。我推荐 make & makefiles,或者如果你想完全留在 R 中,优秀的 remake package
-
@rawr 是的,我只保留
source命令并注释掉所有其他命令。 -
@Ben 我会调查
remake。但是我的目标在knitr中是不可能的吗?