Rmarkdown: list in tbl_df からタブセット&タブを自動生成する

前回の[Rmarkdown: for文でtab & DT::datatableを生成する](https://qiita.com/s_tashiro/items/43e585b4b69756bdae37)をもう少し発展させ、
より実践的なカンペを作成した。

以下のような、データや出力オブジェ等が列で収まっている今風 (???) な`tbl_df`を対象とし、

| | data| summary| ggobj|
|------------:|-----------:|------------:|-----------:|
|          1|\<data.frame [50 × 2]> |\<S3: datatables>|\<S3: gg>|
|          2|\<data.frame [150 × 5]>|\<S3: datatables>|\<S3: gg>|
|          3|\<data.frame [60 × 3]>|\<S3: datatables>|\<S3: gg>|

列名が**セクション名**、各要素名が**タブ名**、中身は当然中身、と出力させる。
汎用性を上げるべく (?)、要素の抜き出しには`purrr::pluck()`を用いた。


```r
 ## データ準備部分 (ちょっとアホなコード…)
  #   組み込みデータ3つを list in tbl_df化し、出力用要素を列で付け加える

data_tbl <- list(cars = cars, iris = iris, ToothGrowth = ToothGrowth) %>% 
  tibble(data = .) %>% 
  mutate(summary = map(data, ~ summary(.) %>% 
                         xtable() %>% datatable()),
         ggobj = list(ggplot(data[[1]], aes(speed, dist)) + geom_point(),
                      ggplot(data[[2]], aes(Petal.Length, Sepal.Length, colour = Species)) + geom_point(),
                      ggplot(data[[3]], aes(dose, len, fill = supp, group = interaction(dose, supp))) + geom_boxplot()) %>% 
           set_names(names(data)))
```
```r
 ## Rmarkdownでの出力用文字列を作成する
  #  中身抜き出し用の文字列に加えて、
  #    各列の先頭要素には、タブセット用文字列 "## 列名 {.tabset}\n\n" を
  #    全要素共通で、タブ用文字列 "### 要素名" を、頭につけ加える

out <- data_tbl %>%
  select(summary, ggobj) %>%                                         # 列選択
  imap(~ paste0(
    c(paste0("##", .y, " {.tabset}\n\n"), rep("", length(.) - 1)),   # タブセット生成用
    "###", names(.x),                                                # タブ生成用 (次行は中身抜き出し用)
    "\n```{r results='asis', echo=FALSE} \n\n pluck(data_tbl, '", .y, "', '",  names(.x), "') \n\n``` \n")
  ) %>%
  unlist()
```

あとはこいつを以下で出力させる

```r
`r paste(knit(text = out), collapse = '\n')`
```

<br>
以下、.Rmdファイル全体

    ---
    title: "test"
    author: "hoge"
    date: "`r Sys.Date()`"
    output: 
      html_document:
        md_extensions: -ascii_identifiers
        toc: true
        toc_float: true  
        toc_depth: 3
    ---
    
    ```{r setup, include=FALSE, echo=FALSE}
    # Rmarkdown options
    knitr::opts_chunk$set(echo=FALSE, out.width="50%", message=FALSE, warning=FALSE)
    
    # package load
    library(tidyverse); library(xtable); library(DT); library(knitr)
    ```
    
    ```{r}
     ## データ準備
      #   組み込みデータ3つを list in tbl_df化し、出力用要素を列で付け加える
    
    data_tbl <- list(cars = cars, iris = iris, ToothGrowth = ToothGrowth) %>% 
      tibble(data = .) %>% 
      mutate(summary = map(data, ~ summary(.) %>% 
                             xtable() %>% datatable()),
             ggobj = list(ggplot(data[[1]], aes(speed, dist)) + geom_point(),
                          ggplot(data[[2]], aes(Petal.Length, Sepal.Length, colour = Species)) + geom_point(),
                          ggplot(data[[3]], aes(dose, len, fill = supp, group = interaction(dose, supp))) + geom_boxplot()) %>% 
               set_names(names(data)))
    
    
     ## Rmarkdownでの出力用文字列を作成する
      #  中身抜き出し用の文字列に加えて、
      #    各列の先頭要素には、タブセット用文字列 "## 列名 {.tabset}\n\n" を
      #    全要素共通で、タブ用文字列 "### 要素名" を、頭につけ加える
    
    out <- data_tbl %>%
      select(summary, ggobj) %>%                                         # 列選択
      imap(~ paste0(
        c(paste0("##", .y, " {.tabset}\n\n"), rep("", length(.) - 1)),   # タブセット生成用
        "###", names(.x),                                                # タブ生成用 (次行は中身抜き出し用)
        "\n```{r results='asis', echo=FALSE} \n\n pluck(data_tbl, '", .y, "', '",  names(.x), "') \n\n``` \n")
      ) %>%
      unlist()
    ```
    
    
    `r paste(knit(text = out), collapse = '\n')`
    
    ## Let's Enjoy !!