当文件名可变时,将文件中的代码包含到 RMarkdown 中

dww*_*dww 5 r rstudio r-markdown

我想在 RMarkdown 中有一个 R 块,其中包含来自外部文件的代码。

我想包含该文件,而不是直接嵌入其内容,因为外部文件包含在各种项目和脚本之间共享的代码,并且我想确保每个程序都使用最新版本。该code = ...块选项用于本作。

如果我编织整个文档,以下方法可以正常工作。但是,如果我尝试在 Rstudio 中运行各个块(根据开发过程中的要求),我会收到错误消息"Error in readLines(include_file) : object 'include_file' not found"

我如何让它工作,以便我可以从 Rstudio 中运行块?

可重现的例子:

首先创建一些包含文件

write_lines("x = 1", 'include_1.r')
write_lines("x = 2", 'include_2.r')
write_lines("x = 3", 'include_3.r')
write_lines("x = 4", 'include_4.r')
Run Code Online (Sandbox Code Playgroud)

然后将以下内容放入 .Rmd 文件中

---
title: "Untitled"
output: html_document
---

```{r setup}
knitr::opts_chunk$set(echo = TRUE)
include_file = list.files(pattern = '^include_.+[Rr]$')
include_file = include_file[which.max(file.info(include_file)$mtime)]
```

I want to embed an R code from a file like this:

```{r, code = readLines(include_file)}
```

Then use the objects from the include file

```{r}
print(x)
```
Run Code Online (Sandbox Code Playgroud)

这是我编织整个文档时输出的样子

在此处输入图片说明

Kev*_*les 2

source.R假设您有一个包含以下内容的文件:

# first code chunk to be included
## @knitr cc_1
var1 <- runif(10)
var2 <- runif(10)
tmp <- sum(var1)
## @knitr end_cc_1

# second code chunk to be included
## @knitr cc_2
prod(var1, var2)
## @knitr end_cc_2
Run Code Online (Sandbox Code Playgroud)

然后你首先必须读取该文件:

```{r}
knitr::read_chunk("source.R")
```
Run Code Online (Sandbox Code Playgroud)

然后您可以从源文件中调用代码块,如下所示:

```{r}
<<cc_1>>
print(tmp)
<<cc_2>>
```
Run Code Online (Sandbox Code Playgroud)

请注意,所有内容都可以位于同一代码块中,但read_chunk() 必须在之前调用<<cc_1>>,并且在本例中<<cc_2>>要求tmp <<cc_1>>必须在之前调用<<cc_2>>

顺便说一句,如果你想默默地评估一堆代码,你可以使用include = FALSE,例如

```{r include = FALSE}
<<cc_1>>
```
Run Code Online (Sandbox Code Playgroud)

然后,您可以调用 的元素<<cc_1>>,例如

```{r}
print(tmp)
```
Run Code Online (Sandbox Code Playgroud)