gpt4 book ai didi

r - 如何使代码块依赖于 knitr/rmarkdown 中的所有先前 block ?

转载 作者:行者123 更新时间:2023-12-04 01:56:12 25 4
gpt4 key购买 nike

目标

我想通过使 block 依赖于所有先前的 block 来创建可重现的数据分析。因此,如果有 3 个 block 并且我在第一个 block 中更改了某些内容,那么后续的 2 个 block 应该重新运行,以便它们反射(reflect)在输出中所做的更改。我想在文档顶部的全局 block 选项中添加这个条件,这样我就不必使用 dependson多次。

问题

如果没有修改, block 的输出不会改变,cache=TRUE .对于包含代码的 block ,我可以使用文档顶部的以下内容使它们依赖于所有以前的 block :

```{r setup, echo=FALSE}
# set global chunk options:
library(knitr)
opts_chunk$set(cache=TRUE, autodep = TRUE)
dep_auto()
```

如果上述任何 block 发生更改,则所有后续 block 都将重新运行。但是,如果我使用 source(),这将不起作用分 block 读取 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 个 block 中的任何一个,第三个 block 在 knit 之后给出正确的输出亭。但是如果我将第一个 block 的代码放在源文件中 data1.R和文件中的第二个 block data2.R ,保持全局 block 选项与以前相同,如果我对源文件进行任何更改,它们不会正确反射(reflect)在第三 block 的输出中。例如,更改 xx <- 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

我需要更改哪些设置才能使用 sourceknitr文档正确吗?

最佳答案

当您使用 source() , 针织 无法分析从中创建的可能对象; 针织 必须能够看到完整的源代码来分析代码块之间的依赖关系。有两种方法可以解决您的问题:

  • 告诉第二个 block 它取决于 x 的值通过添加使用 x 值的任意 block 选项,例如```{r cache.extra = x} ;那么每当x更改,此代码块的缓存将自动失效( more info );
  • 针织 查看完整的源代码;您可以通过 block 选项 code 将源代码传递给代码块,例如```{r code = readLines('data1.R')} (与 data2.R 相同);然后 dep_auto()应该能弄清楚x是从第一个 block 创建的,并在第二个 block 中使用,因此第二个 block 必须依赖于第一个 block 。
  • 关于r - 如何使代码块依赖于 knitr/rmarkdown 中的所有先前 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33269865/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com