【问题标题】:Include code from an external R script, run in, display both code and output包含来自外部 R 脚本的代码,运行,显示代码和输出
【发布时间】:2018-09-19 03:08:11
【问题描述】:

是否可以在 .Rmd 中包含来自外部 R 脚本的代码,同时运行代码、显示代码并在输出 .HTML 文件中显示其结果?例如,如果我有

x <- 1
y <- 3
z <- x + y
z

external.R。在输出文档中,我希望看到上面的代码以及z 的结果,即 4。本质上,我希望与将上面的内容复制/粘贴到 R 块中的结果相同。所以我想要

```{r}
some.library::some.function("external.R")
```

相当于

```{r}
x <- 1
y <- 3
z <- x + y
z
```

在输出 HTML 文件中。 我已经尝试过knitr::read_chunk('external.R)source('external.R) 之类的东西,但是这些都不显示代码。我错过了一些简单的东西吗?


编辑

我发现source('external.R', echo = TRUE) 会产生我所要求的内容,但输出显示的代码/结果的每一行都以## 开头。如果代码只是简单地复制/粘贴到 .Rmd 中的一个块中,有什么方法可以让它看起来像这样?

【问题讨论】:

  • 我想我的第一个问题是:为什么?你想做什么?其次,如果我执行source("my_script.R", echo = T),我看不到任何以## 为前缀的代码/结果。如果我将代码复制并粘贴到 R 终端中,它看起来完全一样。也许我理解错了?
  • 我们会,我不会将结果与它在 R 终端中的样子进行比较。我将它与它在输出 .HTML 文件中的外观进行比较。
  • 我给我的学生一个作业,他们必须完成几项冗长的任务,出于组织目的,我认为使用外部脚本比将所有内容放在多个代码块中更容易。此外,如果他们在 .Rmd 中的代码块中逐行执行代码,Rstudio 会将输出放在块下的“抽屉”中,这对我来说很烦人,因为我认为它的出现更有意义在控制台中,就像在简单的 .R 文件中一样。
  • 我不太关注。您似乎混淆了 RMarkdown 和直接 R 文件。如果您不喜欢 RMarkdown 呈现代码和文本的方式,请不要使用 RMarkdown。但是你说你“没有将结果与它在 R 终端中的样子进行比较。”那么你实际上想要做什么以及你是如何执行代码的?在 R 终端中?在 RStudio 中?代码在 RMarkdown 文件中吗?或者在 R 脚本中。我让我的学生非常成功地使用了 RMarkdown 和 R Notebooks。在我看来,它鼓励透明的代码文档和一致的编码标准。
  • 我喜欢 Rmarkdown 呈现代码和文本的方式。我的意思是,如果我使用source('external.R', echo = T),则输出HTML 文件的每一行前面都有##。如果我只是将外部 R 代码的内容复制/粘贴到 .Rmd 中的代码块中,它会在没有 ## 的情况下呈现。那有意义吗?我对结果的评论是终端参考了您对 R 终端中结果的第一条评论。我并不真正关心这一点 - 我只关心它在输出 HTML 文件中的外观。

标签: r r-markdown knitr


【解决方案1】:

虽然accepted answer 提供了一个简单且有效的解决方案,但我认为最惯用的方法(根本不必修改外部脚本)是使用chunk option code 来设置external.R 的内容作为块代码:

```{r, code = readLines("external.R")}
```

【讨论】:

  • 更好。天哪,我两次更改了接受的答案。我应该等一两天再选择一个。
  • 我认为这一个将是最终答案(其余两个也是正确答案)。多么巧合——我昨天刚刚写了关于code 选项的文章:yihui.name/en/2018/09/code-appendix
  • 如何在不显示外部代码的情况下调用外部脚本?例如,设置 API 密钥?
【解决方案2】:

还有另一种方法,它看起来完全就像在降价文件中包含代码。

您的external.R 文件:

## @knitr answer
x <- 1
y <- 3
z <- x + y
z

您的 Rmarkdown 文件:

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

```{r echo=FALSE}
knitr::read_chunk('external.R')
```

```{r}
<<answer>>
```

这会产生:

【讨论】:

  • 是的。好决定。这并不是我在问题中所要求的,但事实证明,这正是我想要的。
  • 这对我有用,但在 RStudio 中,编辑器指出带有&lt;&lt;answer&gt;&gt; 的行是unexpected token '&lt;' error。我不知道你可以使用像@knitr 这样的信息。
  • 仅供参考,RStudio 给我的错误似乎已经消失了。
【解决方案3】:

您可以在代码块选项中设置comment = NA

例子:

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

```{r setup, include=FALSE}
knitr::opts_chunk$set(
    echo = TRUE,
    comment=NA)
```

## Example

```{r}
source("example.R", echo = T, prompt.echo = "", spaced = F)
```

这会产生

【讨论】:

  • 我想,巴金斯先生,你和我终于相互理解了。这就是诀窍。谢谢莫里茨。
  • 不用担心@haff;-) 很高兴它有帮助。
  • 好的,我不想回到我所说的,但这并不能完全产生我想要的。它几乎就在那里,但也许source 不是正确的功能。在上面的示例中,x &lt;- 3y &lt;- 4 行没有语法突出显示。这些行前面带有 &gt;(就像它们在 R shell 中运行一样),我认为这可能是 source 函数如何工作的工件?
  • @haff 完全没问题。既然我了解了您要做什么,那么一切都变得更有意义了。您可以在source 中使用prompt.echo 更改提示字符。例如,source("example.R", echo = T, prompt.echo = "") 将删除 &gt;。您还可以使用 source("example.R", echo = T, prompt.echo = "", spaced = F) 删除额外的额外换行符。这有帮助吗?
  • 是的 - 很高兴知道。我认为 spadarian 的回答抓住了我想做的更好的事情,但我可以预见到您列出的源选项对我有帮助的其他情况。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2015-12-12
  • 1970-01-01
相关资源
最近更新 更多