Как автоматизировать вложенные разделы в Rmds, которые включают текст, карты и таблицы - PullRequest
3 голосов
/ 11 июля 2019

Я нашел несколько примеров ( Как извлечь содержимое SQL-файлов с помощью R , Использование цикла для генерации фрагмента текста в rmarkdown , Автоматизация генерации предварительно отформатированноготекст в Rmarkdown с использованием R ), но ни один из них не работает в моем случае с вложенными разделами, включая рисунки.Ожидаемый результат:

enter image description here

Кажется, мне нужен какой-то способ обработки включенных фрагментов кода (например, cat("```{r, fig.width=8.4, fig.height=7}\n") ... cat("```\n") правильно, но я не могу найтиспособ.

Редактировать : Я нашел это здесь , но все еще не могу заставить его работать

kexpand <- function(chunkname, fig.width, fig.height) {
  cat(knitr::knit(text = knitr::knit_expand(text = 
     sprintf("```{r %s, fig.width=%s, fig.height=%s}\n.chunk_code\n", 
             chunkname, 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 = ranges[i])
  kexpand(i, 8.4, 7)

Редактировать 2 : Есть связанный вопрос . Хотя он кажется близким, он все равно не работает. См. Также мой подход здесь , который я использую, потому что у меня есть вложенный список - Я не хочу, чтобы все рисунки были рядом друг с другом.


Все разделы включают рисунки одного типа, носодержание меняется, конечно. Ниже вы найдете

  • лучшее, что я получил до сих пор, и
  • эталонный Rmd, который показывает ожидаемый результат, но с кусочками копирования-вставки

Примеры:

---
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}\n"))
  cat("##### Map\n")

  # code //
  cat("```{r, fig.width=8.4, fig.height=7}\n")
  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("```\n")
  # //

  cat("##### Tabelle\n")

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

### 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}\n"))
  cat("##### Karte\n")

  # code //
  cat("```{r, fig.width=8.4, fig.height=7}\n")
  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("```\n")
  # //

  cat("##### Tabelle\n")

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

---
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)
```

Из 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    
...