【问题标题】:Include code from file into RMarkdown when filename is variable当文件名可变时,将文件中的代码包含到 RMarkdown 中
【发布时间】:2020-02-17 16:34:12
【问题描述】:

我想在 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')

然后将以下内容放入一个.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)
```

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

【问题讨论】:

  • 你不想只在一个块中获取脚本?
  • 感谢@camille - 是的,这样可以避免错误,但是您不会在输出文档中看到源代码。
  • 啊,我明白了。而且我想在一个块中获取并在另一个块中调用readLines 太多余了......
  • 实际上这就是我现在正在使用的当前 cludge。希望有更简洁、更惯用的东西。

标签: r rstudio r-markdown


【解决方案1】:

假设你有一个文件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

那么你首先要读取文件:

```{r}
knitr::read_chunk("source.R")
```

然后你可以像这样从源文件中调用代码块:

```{r}
<<cc_1>>
print(tmp)
<<cc_2>>
```

请注意,所有内容都可以在同一个代码块中,但 read_chunk() 必须在 &lt;&lt;cc_1&gt;&gt; 之前调用,在这种情况下 &lt;&lt;cc_2&gt;&gt; 需要 tmp &lt;&lt;cc_1&gt;&gt; 必须在 &lt;&lt;cc_2&gt;&gt; 之前调用。

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

```{r include = FALSE}
<<cc_1>>
```

然后,您可以调用&lt;&lt;cc_1&gt;&gt; 的元素,例如

```{r}
print(tmp)
```

【讨论】:

  • 谢谢,我知道read_chunk,(并与 Lyx 一起使用)。不幸的是,它与缓存不兼容,afaik。因此希望改用code =
  • 我明白了,就好像你不能使用第一个代码块来运行第二个代码块,除非你编织整个文档,对吧?
  • 另外,我对此进行了测试,它不允许您在 Rstudio 中以交互方式运行各个块。只有当您编织整个文档时似乎才有效......所以不幸的是没有回答这个问题。还是谢谢。
猜你喜欢
  • 2019-11-30
  • 2021-08-20
  • 2018-04-03
  • 2023-03-25
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多