模块化R降价结构

Del*_*eet 7 r r-markdown rnotebook

有一些问题已经存在,但它们要么不清楚,要么提供无效的解决方案,可能是因为它们已经过时了:

用于大型项目的模块化代码结构

R Markdown/Notebook很不错,但就其呈现方式而言,通常只有一个文件包含所有文本和所有代码块.我经常有一些项目,这样的单一文件结构不是一个好的设置.相反,我使用单个.R.R文件按顺序加载其他文件.我想使用R Notebook复制这个结构,即我有一个.Rmd文件,我从多个.R文件中调用代码.

以这种方式使用项目的好处是,它允许使用.R文件的RStudio进行良好的正常工作流程,但也可以使用R Notebook/Markdown的简洁输出而无需复制代码.

最小的例子

这被简化以使示例尽可能小.两个.R文件和一个主.Rmd文件.

start.R

# libs --------------------------------------------------------------------
library(pacman)
p_load(dplyr, ggplot2)
#normally load a lot of packages here

# data --------------------------------------------------------------------
d = iris
#use iris for example, but normally would load data from file

# data manipulation tasks -------------------------------------------------
#some code here to extract useful info from the data
setosa = dplyr::filter(d, Species == "setosa")
Run Code Online (Sandbox Code Playgroud)

plot.R

#setosa only
ggplot(setosa, aes(Sepal.Length)) +
  geom_density()

#all together
ggplot(d, aes(Sepal.Length, color = Species)) +
  geom_density()
Run Code Online (Sandbox Code Playgroud)

然后是笔记本文件:

notebook.Rmd:

---
title: "R Notebook"
output:
  html_document: default
  html_notebook: default
---

First we load some packages and data and do slight transformation:

```{r start}
#a command here to load the code from start.R and display it
```

```{r plot}
#a command here to load the code from plot.R and display it
```
Run Code Online (Sandbox Code Playgroud)

期望的输出

所期望的输出是其中的一个从手动复制在代码获取start.Rplot.R到在代码块notebook.Rmd.这看起来像这样(由于缺少屏幕空间而丢失了一些):

在此输入图像描述

我尝试过的事情

source

这会加载代码,但不会显示它.它只显示source命令:

在此输入图像描述

knitr::read_chunk

这里提到这个命令,但实际上它source和我所说的一样:它加载代码但什么也没显示.

在此输入图像描述

如何获得所需的输出?

Del*_*eet 5

解决方案是使用knitr的chunk选项code。根据knitr文档

code:(NULL;字符)如果提供,它将覆盖当前块中的代码;这允许我们以编程方式将代码插入到当前块中;例如,块选项 code = capture.output(dump(' Fivenum', '')) 将使用函数 Fivenum 的源代码来替换当前块

但是没有提供示例。听起来好像必须为其提供一个字符向量,所以让我们尝试一下readLines

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

```{r plot, code=readLines("start.R")}
```
Run Code Online (Sandbox Code Playgroud)

这会产生所需的输出,从而允许模块化的项目结构。

直接向其提供文件不起作用(即code="start.R"),但将是一个很好的增强。