Stampa un numero qualsiasi di dataframe memorizzati nell'elenco come tabelle a pagine in rmarkdown

Aug 21 2020

Spesso desidero stampare i dataframe contenuti in un elenco come tabelle impaginate nei miei documenti rmarkdown. La chiamata a ciascun dataframe individualmente esegue il rendering dell'output desiderato se df_printè selezionata l' opzione giusta . Tuttavia, il punto di avere un elenco è che il numero di dataframe varia a seconda dei parametri passati al documento rmarkdown; quindi non è una vera soluzione.

Sulla base della risposta di Vincent Guyader a questa domanda e su questo esempio di rmarkdown::paged_table, ho provato a fare quanto segue senza successo.

C'è un modo per raggiungere questo obiettivo? Sarei felice di utilizzare qualsiasi pacchetto che supporti l'impaginazione in remoto simile df_printall'opzione.

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


```

Risposte

2 stefan Aug 22 2020 at 07:56

Il problema è che le dipendenze JS necessarie per rendere il Datatable non sono incluse nell'output HTML. Una soluzione alternativa che ho preso in prestito da qui è aggiungere un blocco di codice

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

al di fuori del ciclo o dell'istruzione map che assicura che le dipendenze JS siano incluse. Inoltre, consiglierei di passare a purrr::walkpoiché l'uso mapha l'effetto che le tabelle vengono tracciate due volte.

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

Quando si usa l' results='asis'argomento, il renderer (qui DT) deve essere inizializzato una volta prima di essere applicato a una asislista.
Questo sembra essere un problema generale, vedi qui con il volantino , e qui con Highcharter .

La risposta a questa domanda generale è stata data qui .

In questo caso:

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

```