如何自动化 Rmds 中的嵌套部分,包括文本、地图和表格 [英] How to automate nested sections in Rmds which include text, maps and tables

查看:11
本文介绍了如何自动化 Rmds 中的嵌套部分,包括文本、地图和表格的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我找到了几个例子(

看来,我需要一些方法来处理包含的代码块(例如 cat("```{r, fig.width=8.4, fig.height=7} ") ... cat("``` ") 正确,但我找不到方法.

编辑:我在这里找到了这个,但仍然无法正常工作

kexpand <- function(chunkname, fig.width, fig.height) {猫(knitr::knit(text = knitr::knit_expand(text =sprintf("```{r %s, fig.width=%s, fig.height=%s}
.chunk_code
",块名,fig.width,fig.height))))}

然后在块中:

 .chunk_code <- leaflet() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[i])kexpand(i, 8.4, 7)

编辑 2:有一个相关问题.尽管它看起来很接近,但它仍然不起作用.另请参阅我的方法 here 因为我有嵌套列表 -我不希望所有人物都挨着.

<小时>

所有部分都包含相同类型的图形,但内容当然会发生变化.您可以在下面找到一个

  • 到目前为止我得到的最好的和
  • reference Rmd 显示 expeted 输出但带有复制粘贴块

例子:

---标题:我得到的最好的"作者:《SQC》日期:2019 年 7 月 11 日"输出:html_document---```{r 设置,包括=FALSE}knitr::opts_chunk$set(echo = FALSE, fig.width=8.4, fig.height=7)图书馆(传单)范围 <- paste0("section_", c(1:3))```# 标题级别 1这是一个 R Markdown 文档.## 标题级别 2 (tab) {.tabset}### 标题级别 3(选项卡){.tabset}```{r,回声=假,结果='asis'}for (i in 1:length(ranges)) {cat(paste0("#### 标题级别 4 `r",范围[i], "` vs. `r", 范围[i - 1], "` {.tabset}
"))cat("##### 地图
")# 代码//cat("```{r, fig.width=8.4, fig.height=7}
")传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[i])猫(```
")#//cat("##### 表
")# 代码//cat("```{r}
")DT::datatable(data.frame(x = 1, y = range[i], stringsAsFactors = FALSE),行名 = FALSE)猫(```
")#//}```### 标题级别 3(选项卡){.tabset}```{r,回声=假,结果='asis'}for (i in 1:length(ranges)) {cat(paste0("#### `r ", range[i], "` vs. `r ", range[i - 1], "` {.tabset}
"))cat("##### 卡丁车
")# 代码//cat("```{r, fig.width=8.4, fig.height=7}
")传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[i])猫(```
")#//cat("##### 表
")# 代码//cat("```{r}
")DT::datatable(data.frame(x = 1, y = range[i], stringsAsFactors = FALSE),行名 = FALSE)猫(```
")#//}```

<小时>

---标题:《参考》作者:《SQC》日期:2019 年 7 月 11 日"输出:html_document---```{r 设置,包括=FALSE}knitr::opts_chunk$set(echo = FALSE)图书馆(传单)范围 <- paste0("section_", c(1:4))```# 标题级别 1这是一个 R Markdown 文档.## 标题级别 2 (tab) {.tabset}### 标题级别 3(选项卡){.tabset}#### 标题级别 4 `r 范围 [2]` 与 `r 范围 [1]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[2])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[2], stringsAsFactors = FALSE),行名 = FALSE)```#### 标题级别 4 `r 范围 [3]` 与 `r 范围 [2]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[3])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[3], stringsAsFactors = FALSE),行名 = FALSE)```#### 标题级别 4 `r 范围 [4]` 与 `r 范围 [3]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[4])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[4], stringsAsFactors = FALSE),行名 = FALSE)```### 标题级别 3(选项卡){.tabset}#### 标题级别 4 `r 范围 [2]` 与 `r 范围 [1]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[2])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[2], stringsAsFactors = FALSE),行名 = FALSE)```#### 标题级别 4 `r 范围 [3]` 与 `r 范围 [2]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[3])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[3], stringsAsFactors = FALSE),行名 = FALSE)```#### 标题级别 4 `r 范围 [4]` 与 `r 范围 [3]` {.tabset}#####卡丁车```{r, fig.width=8.4, fig.height=7}传单() %>%addTiles() %>%addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%addCircleMarkers(lat = 47, lng = 9, popup = 范围[4])```##### 塔贝尔```{r}DT::datatable(data.frame(x = 1, y = 范围[4], stringsAsFactors = FALSE),行名 = FALSE)```

来自 xfun::session_info('knitr')

R 版本 3.5.1 (2018-07-02)平台:x86_64-w64-mingw32/x64(64位)在以下环境下运行:Windows >= 8 x64(内部版本 9200),RStudio 1.1.453语言环境:LC_COLLATE=German_Switzerland.1252 LC_CTYPE=German_Switzerland.1252 LC_MONETARY=German_Switzerland.1252LC_NUMERIC=C LC_TIME=German_Switzerland.1252包版本:evaluate_0.14 glue_1.2.0 graphics_3.5.1 grDevices_3.5.1 highr_0.7 knitr_1.23 magrittr_1.5markdown_0.8 methods_3.5.1 mime_0.5 stats_3.5.1 stringi_1.2.3 stringr_1.3.1 tools_3.5.1utils_3.5.1 xfun_0.7 yaml_2.1.19

解决方案

试试类似

---标题:我得到的最好的"作者:《SQC》日期:2019 年 7 月 11 日"输出:html_document---```{r 设置,包括=FALSE}knitr::opts_chunk$set(echo = FALSE, fig.width=8.4, fig.height=7)图书馆(传单)范围 <- paste0("section_", c(1:3))传单()DT::datatable(data.frame())```# 标题级别 1这是一个 R Markdown 文档.## 标题级别 2 (tab) {.tabset}### 标题级别 3(选项卡){.tabset}```{r,回声=假,结果='asis'}for (i in 1:length(ranges)) {cat(paste0("#### 标题级别 4 `r",range[i], "` vs. `r", range[i - 1], "` {.tabset}
"))cat("##### 地图
")# 代码//cat("```{r, fig.width=8.4, fig.height=7}
")传单() %>%addTiles() %>%knitr::knit_print() %>%猫()猫("```
")#//cat("##### 表
")# 代码//猫(```{r}
")DT::datatable(data.frame(x = 1, y = range[i], stringsAsFactors = FALSE),行名 = FALSE) %>%knitr::knit_print() %>%猫()猫("```
")#//}```

I found several examples (How to extract the content of SQL-Files using R, Use loop to generate section of text in rmarkdown, Automating the generation of preformated text in Rmarkdown using R), but none works in my case with nested sections including figures. Expected output:

It seems, I need some way to handle the included code chunks (e.g. cat("```{r, fig.width=8.4, fig.height=7} ") ... cat("``` ") properly, but I can't find a way.

Edit: I found this here, but still can't make it work

kexpand <- function(chunkname, fig.width, fig.height) {
  cat(knitr::knit(text = knitr::knit_expand(text = 
     sprintf("```{r %s, fig.width=%s, fig.height=%s}
.chunk_code
", 
             chunkname, fig.width, fig.height))))
}

and then in the chunks:

  .chunk_code <- leaflet() %>%
    addTiles() %>%
    addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
    addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
    addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
    addCircleMarkers(lat = 47, lng = 9, popup = ranges[i])
  kexpand(i, 8.4, 7)

Edit 2: There is a related question. Although it seems to be close, it still does not work. See also my approach here which I use because I have nested list - I do not want all figures next to each other.


All sections include the same type of figures, but the content changes of course. Below you find a

  • the best I got so far and
  • reference Rmd which shows the expeted output but with copy-paste chunks

Examples:

---
title: "The best I got"
author: "SQC"
date: "11 Juli 2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, fig.width=8.4, fig.height=7)
library(leaflet)
ranges <- paste0("section_", c(1:3))
```

# Title level 1

This is an R Markdown document. 

## Title level 2 (tab) {.tabset}

### Title level 3 (tab) {.tabset}

```{r, echo = FALSE, results='asis'}
for (i in 1:length(ranges)) {
  cat(paste0("#### Title level 4 `r ", 
             ranges[i], "` vs. `r ", ranges[i - 1], "` {.tabset}
"))
  cat("##### Map
")

  # code //
  cat("```{r, fig.width=8.4, fig.height=7}
")
  leaflet() %>%
    addTiles() %>%
    addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
    addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
    addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
    addCircleMarkers(lat = 47, lng = 9, popup = ranges[i])
  cat("```
")
  # //

  cat("##### Tabelle
")

  # code //
  cat("```{r}
")
  DT::datatable(data.frame(x = 1, y = ranges[i], stringsAsFactors = FALSE),
                rownames = FALSE)
  cat("```
")
  # //
}
```

### Title level 3 (tab) {.tabset}

```{r, echo = FALSE, results='asis'}
for (i in 1:length(ranges)) {
  cat(paste0("#### `r ", ranges[i], "` vs. `r ", ranges[i - 1], "` {.tabset}
"))
  cat("##### Karte
")

  # code //
  cat("```{r, fig.width=8.4, fig.height=7}
")
  leaflet() %>%
    addTiles() %>%
    addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
    addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
    addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
    addCircleMarkers(lat = 47, lng = 9, popup = ranges[i])
  cat("```
")
  # //

  cat("##### Tabelle
")

  # code //
  cat("```{r}
")
  DT::datatable(data.frame(x = 1, y = ranges[i], stringsAsFactors = FALSE),
                rownames = FALSE)
  cat("```
")
  # // 
}
```


---
title: "Reference"
author: "SQC"
date: "11 Juli 2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
library(leaflet)
ranges <- paste0("section_", c(1:4))
```

# Title level 1

This is an R Markdown document. 

## Title level 2 (tab) {.tabset}

### Title level 3 (tab) {.tabset}

#### Title level 4 `r ranges[2]` vs. `r ranges[1]` {.tabset}

##### Karte
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[2])
```

##### Tabelle
```{r}
DT::datatable(data.frame(x = 1, y = ranges[2], stringsAsFactors = FALSE),
              rownames = FALSE)
```

#### Title level 4 `r ranges[3]` vs. `r ranges[2]` {.tabset}

##### Karte 
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[3])
```

##### Tabelle 
```{r}
DT::datatable(data.frame(x = 1, y = ranges[3], stringsAsFactors = FALSE),
              rownames = FALSE)
```

#### Title level 4 `r ranges[4]` vs. `r ranges[3]` {.tabset}

##### Karte 
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[4])
```

##### Tabelle 
```{r}
DT::datatable(data.frame(x = 1, y = ranges[4], stringsAsFactors = FALSE),
              rownames = FALSE)
```

### Title level 3 (tab) {.tabset}

#### Title level 4 `r ranges[2]` vs. `r ranges[1]` {.tabset}

##### Karte
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[2])
```

##### Tabelle
```{r}
DT::datatable(data.frame(x = 1, y = ranges[2], stringsAsFactors = FALSE),
              rownames = FALSE)
```

#### Title level 4 `r ranges[3]` vs. `r ranges[2]` {.tabset}

##### Karte 
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[3])
```

##### Tabelle 
```{r}
DT::datatable(data.frame(x = 1, y = ranges[3], stringsAsFactors = FALSE),
              rownames = FALSE)
```

#### Title level 4 `r ranges[4]` vs. `r ranges[3]` {.tabset}

##### Karte 
```{r, fig.width=8.4, fig.height=7}
leaflet() %>%
  addTiles() %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM") %>%
  addProviderTiles(providers$Stamen.TonerLite, group = "Toner Lite") %>%
  addLayersControl(baseGroups = c("OSM", "Toner Lite")) %>%
  addCircleMarkers(lat = 47, lng = 9, popup = ranges[4])
```

##### Tabelle 
```{r}
DT::datatable(data.frame(x = 1, y = ranges[4], stringsAsFactors = FALSE),
              rownames = FALSE)
```

From xfun::session_info('knitr')

R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200), RStudio 1.1.453

Locale:
  LC_COLLATE=German_Switzerland.1252  LC_CTYPE=German_Switzerland.1252    LC_MONETARY=German_Switzerland.1252
  LC_NUMERIC=C                        LC_TIME=German_Switzerland.1252    

Package version:
  evaluate_0.14   glue_1.2.0      graphics_3.5.1  grDevices_3.5.1 highr_0.7       knitr_1.23      magrittr_1.5   
  markdown_0.8    methods_3.5.1   mime_0.5        stats_3.5.1     stringi_1.2.3   stringr_1.3.1   tools_3.5.1    
  utils_3.5.1     xfun_0.7        yaml_2.1.19    

解决方案

Try something like

---
title: "The best I got"
author: "SQC"
date: "11 Juli 2019"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, fig.width=8.4, fig.height=7)
library(leaflet)
ranges <- paste0("section_", c(1:3))
leaflet()
DT::datatable(data.frame())
```

# Title level 1

This is an R Markdown document. 

## Title level 2 (tab) {.tabset}

### Title level 3 (tab) {.tabset}

```{r, echo = FALSE, results='asis'}
for (i in 1:length(ranges)) {
  cat(paste0("#### Title level 4 `r ", 
             ranges[i], "` vs. `r ", ranges[i - 1], "` {.tabset}
"))
  cat("##### Map
")

  # code //
  cat("```{r, fig.width=8.4, fig.height=7}
")
  leaflet() %>%
    addTiles() %>%
    knitr::knit_print() %>%
    cat()
  cat("```
")
  # //

  cat("##### Tabelle
")

  # code //
  cat("```{r}
")
  DT::datatable(data.frame(x = 1, y = ranges[i], stringsAsFactors = FALSE),
                rownames = FALSE) %>%
    knitr::knit_print() %>%
    cat()
  cat("```
")
  # //
}
```

这篇关于如何自动化 Rmds 中的嵌套部分,包括文本、地图和表格的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆