リストに保存されている任意の数のデータフレームをrmarkdownのページテーブルとして印刷する

Aug 21 2020

リストに含まれているデータフレームを、rmarkdownドキュメントのページテーブルとして印刷したいことがよくあります。適切なdf_printオプションが選択されている場合、各データフレームを個別に呼び出すと、目的の出力がレンダリングされます。ただし、リストを持つことのポイントは、データフレームの数がrmarkdownドキュメントに渡されるパラメーターによって異なることです。したがって、それは実際の解決策ではありません。

この質問に対するVincentGuyaderの回答と、この例に基づいてrmarkdown::paged_table、私は次のことを試みましたが成功しませんでした。

これを達成する方法はありますか?df_printオプションにリモートで類似したページネーションをサポートするパッケージを使用できれば幸いです。

---
title: "Printing paged tables from a list of dataframes in Rmarkdown"
output: 
  html_document:
    df_print: paged
---


```{r}

library(DT)
library(rmarkdown)
library(purrr)
library(knitr)


df_list <- list("cars" = mtcars, "flowers" = iris)


knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, results='asis')

```

### Desired output but impossible to generalise 


```{r}

df_list[["cars"]]

```


```{r}

df_list[["flowers"]]

```

### datatable shows as blanks on the page


```{r}

map(df_list, ~DT::datatable(.x) %>%
      htmltools::tagList() %>%
      print())

```


### rmarkdown outputs dataframe contents as one very long string


```{r}

map(df_list, rmarkdown::paged_table)


```

回答

2 stefan Aug 22 2020 at 07:56

問題は、Datatableをレンダリングするために必要なJSの依存関係がHTML出力に含まれていないことです。ここから借りた回避策は、コードチャンクを追加することです

```{r init-step, include=FALSE}
DT::datatable(mtcars)
```

JS依存関係が含まれることを保証するループまたはマップステートメントの外側。また、purrr::walk使用mapするとテーブルが2回プロットされる効果があるため、に切り替えることをお勧めします。

---
title: "Printing paged tables from a list of dataframes in Rmarkdown"
output: 
  html_document:
    df_print: paged
---


```{r}
library(DT)
library(rmarkdown)
library(purrr)
library(knitr)

df_list <- list("cars" = mtcars, "flowers" = iris)

knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, results='asis')
```

### Desired output but impossible to generalise 

```{r}
df_list[["cars"]]
```  

```{r}
df_list[["flowers"]] 
```

### datatable shows as blanks on the page

```{r init-step, include=FALSE}
DT::datatable(mtcars)
```  

```{r}
walk(df_list, ~DT::datatable(.x) %>%
      htmltools::tagList() %>%
      print())
```
1 Waldi Aug 22 2020 at 08:00

results='asis'引数を使用する場合、レンダラー(ここではDT)は、asisリストに適用する前に一度初期化する必要があります。
これは一般的な問題のようです。リーフレットでここを、Highcharterでここを参照してください。

この一般的な質問に対する答えはここにあります。

この場合:

---
title: "Printing paged tables from a list of dataframes in Rmarkdown"
output:
  html_document:
  df_print: paged
---
  
```{r,}

library(DT)
library(rmarkdown)
library(purrr)
library(knitr)


df_list <- list("cars" = mtcars, "flowers" = iris)


knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE, results='asis')
# initialize the renderer
data.frame() %>%
  DT::datatable() %>%
  knitr::knit_print() %>%
  attr('knit_meta') %>%
  knitr::knit_meta_add() %>%
  invisible()

```


```{r , results='asis'}
#Remove already printed element and print the rest
df_list[[1]] <- NULL

map(df_list, ~DT::datatable(.x) %>%
      htmltools::tagList() %>%
      print())

```