有一些问题已经存在,但它们要么不清楚,要么提供不起作用的解决方案,可能是因为它们已经过时了:
Markdown /笔记本很不错,但就其呈现方式而言,通常只有一个文件包含所有文本和所有代码块。我经常有一些项目,这样的单一文件结构不是一个好的设置。相反,我使用单个.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")
plot.R
#setosa only
ggplot(setosa, aes(Sepal.Length)) +
geom_density()
#all together
ggplot(d, aes(Sepal.Length, color = Species)) +
geom_density()
然后是笔记本文件:
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
```
所需的输出是将start.R
和plot.R
的代码手动复制到notebook.Rmd
中的代码块中的输出。这看起来像这样(由于缺少屏幕空间而丢失了一些):
source
这会加载代码,但不会显示它。它只显示source
命令:
knitr::read_chunk
这个命令被提到here,但实际上它与source
的作用相同:据我所知:它加载代码但没有显示任何内容。
如何获得所需的输出?
答案 0 :(得分:4)
解决方案是使用knitr的块选项code
。根据{{3}}:
代码:( NULL;字符)如果提供,它将覆盖中的代码 目前的块;这允许我们以编程方式将代码插入到 目前的块;例如块选项代码= capture.output(dump('fivenum',''))将使用的源代码 函数fivenum替换当前的块
但是没有提供示例。听起来像是要为它提供一个字符向量,所以让我们试试readLines
:
```{r start, code=readLines("start.R")}
```
```{r plot, code=readLines("start.R")}
```
这会产生所需的输出,从而允许模块化的项目结构。
直接向它提供文件不起作用(即code="start.R"
),但这将是一个很好的增强。
答案 1 :(得分:2)
为了与R笔记本电脑互操作,您可以使用如上所述的knitr read_chunk
方法。在笔记本中,您必须在设置块中调用read_chunk
;因为您可以按任何顺序运行笔记本块,这可以确保外部代码始终可用。
以下是使用read_chunk
将外部R脚本中的代码导入笔记本的最小示例:
<强> example.Rmd 强>
```{r setup}
knitr::read_chunk("example.R")
```
```{r chunk}
```
<强> example.R 强>
## ---- chunk
1 + 1
当您在笔记本中执行空块时,将插入外部文件中的代码,并且结果以内联方式显示,就好像块包含该代码一样。
答案 2 :(得分:1)
根据我上面的评论,我使用这里的库来处理文件夹中的项目:
```{ r setup, echo=FALSE, message=FALSE, warning=FALSE, results='asis'}
library(here)
insert <- function(filename){
readLines(here::here("massive_report_folder", filename))
}
```
然后每个块看起来像
```{ r setup, echo=FALSE, message=FALSE, warning=FALSE,
results='asis', code=insert("extra_file.R")}
```