gpt4 book ai didi

r - 在 R markdown 中外部化配置文件和函数

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

我无法理解在 R 笔记本中外部化代码的不同方法之间的(实际)差异。引用了之前的questions或到 documentation , 目前还不清楚采购外部 .R 文件或 read_chunk() 它们的区别。出于实际目的,让我们考虑以下内容:

  1. 我想用外部 config.R 文件加载库:据我所知,最直观的方法似乎是将 config.R 创建为

    library(first_package)
    library(second_package)
    ...

    并且,在一般的 R 笔记本中(例如,main.Rmd)这样调用它

    ```{r}
    source('config.R')
    ```

    ```{r}
    # use the libraries included above
    ```

    然而,这并不能识别包含的包,所以看起来寻找外部配置文件是没有用的。同样使用 read_chunk() 代替。因此问题是:如何在顶部包含库,以便在主 Markdown 脚本中识别它们?

  2. 假设我想在外部定义全局函数,然后将它们包含在主笔记本中:按照与上面相同的方式将它们包含在外部 foo.R 文件中并包含他们在主要的。

同样,在这种情况下,read_chunk() 似乎没有完成这项工作,而 source('foo.R') 可以;文档指出前者“只评估代码,但不执行它”:什么时候曾经有人只想评估代码而不执行它?不同的情况:为什么人们会出于实际目的使用 read_chunk() 而不是 source

最佳答案

  1. This does not recognise the packages included

    在您的示例中,first_packagesecond_package 在第二个代码块的工作环境中均可用。

    尝试将 library(nycflights13) 放在 R 文件中,将 head(airlines) 放在 Rmd 文件的第二个 block 中。如果 nycflights13 包未成功加载 source,调用 knit("main.Rmd") 将失败。

    <
  2. read_chunk 实际上确实实现了这一点(与 source 一起)但是他们以不同的方式进行。使用 source,您将在 source 之后直接使用全局函数(如您所见)。但是,对于 read_chunk,正如您所指出的,因为它仅评估代码,但不执行它,您需要显式执行该 block ,然后该函数才可用。 (请参阅下面的 third_config_chunk 示例。在报告中包含 third_config_chunk 的空 block 允许在后续 block 中调用全局 some_function。)

关于“只评估代码,但不执行它”,这是 R 编程的一个完整属性,称为 lazy evaluation .这个想法是您可能想要创建一些函数或模板代码,这些函数或模板代码会被读入您的 R 环境但不会在现场执行,从而允许您在评估之前修改环境/参数。这也允许您多次执行相同的代码块,而 source 将只运行一次已经提供的代码。

考虑一个示例,其中您有一个外部 R 脚本,其中包含报告中不需要的大量设置代码。可以将此文件格式化为许多“ block ”,这些 block 将使用 read_chunk 加载到工作环境中,但在明确告知之前不会进行评估。

为了使用 read_chunk() 将您的 config.R 外部化,您可以将 R 脚本编写为:

config.R

# ---- config_preamble
## setup code that is required for config.R
## to run but not for main.Rmd

# ---- first_config_chunk
library(nycflights13)
library(MASS)

# ---- second_config_chunk
y <- 1

# ---- third_config_chunk
some_function <- function(x) {
x + y
}

# ---- fourth_config_chunk
some_function(10)

# ---- config_output
## code that is output during `source`
## and not wanted in main.Rmd
print(some_function(10))

要将此脚本与外部化方法一起使用,您需要按如下方式设置 ma​​in.Rmd:

ma​​in.Rmd

```{r, include=FALSE}
knitr::read_chunk('config.R')
```

```{r first_config_chunk}
```

The packages are now loaded.

```{r third_config_chunk}
```

`some_function` is now available.

```{r new_chunk}
y <- 20
```

```{r fourth_config_chunk}
```
## [1] 30

```{r new_chunk_two}
y <- 100
lapply(seq(3), some_function)
```
## [[1]]
## [1] 101
##
## [[2]]
## [1] 102
##
## [[3]]
## [1] 103

```{r source_file_instead}
source("config.R")
```
## [1] 11

如您所见,如果您要source 这个文件,将无法在执行之前修改对some_function 的调用,并且该调用会打印一个输出“11”。现在这些 block 在环境中可用,它们可以被重新调用任意次数(例如,在更改 y 的值之后)或在当前环境中以任何其他方式使用(例如new_chunk_two) 如果您不希望 R 脚本的其余部分执行,则 source 无法实现。

关于r - 在 R markdown 中外部化配置文件和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48356264/

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