3

我在理解 R 笔记本中外部化代码的不同方法之间的(实际)差异时遇到了问题。参考了先前的问题文档后,仍不清楚采购外部.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()。因此问题是:如何在顶部包含库,以便在主降价脚本中识别它们?

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

再一次,似乎read_chunk()没有做这项工作,而source('foo.R')在这种情况下,做;文档指出前者“只评估代码,但不执行它”:在什么情况下,人们只想评估代码而不执行它?不同的提出:出于实际目的,为什么要使用read_chunk()而不是, ?source

4

1 回答 1

4
  1. 这不识别包含的包

    在您的示例中,first_package并且second_package 在第二个代码块的工作环境中可用。

    尝试放入library(nycflights13)R 文件和head(airlines)Rmd 文件的第二块。如果包没有成功加载,调用knit("main.Rmd")将失败。nycflights13source

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

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

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

为了使您的config.R使用外部化,您read_chunk()可以将 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))

要将此脚本与外部化方法一起使用,您需要按如下方式设置main.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”。现在这些块在环境中可用,它们可以被重新调用任意次数(例如,在更改 的值之后y)或在当前环境中以任何其他方式使用(例如),这在ifnew_chunk_two中是不可能的source 您不希望 R 脚本的其余部分执行.

于 2018-01-20T13:38:02.007 回答