rlistfor-loopr-markdownr-flextable

Printing flextables from a list of lists in R Markdown


I have example data as follows:

library(data.table)
library(flextable)
datA <- fread("anyvar somevar
               2  4
               2  3
               2  5")

dat_list <- list("one" = list("datA" = datA, "datB" = 2*datA),"two" = list("datC" = 3*datA, "datD" = 4*datA), "three" = list("datE" = 5*datA, "datF" = 6*datA))

for (i in seq_along(dat_list) ) {
  for (j in seq_along( dat_list[[i]] ) ) {
    dat_list[[i]][[j]] <- flextable( dat_list[[i]][[j]] )
  }
}

I want to print out part of this list in R Markdown. In R I can just use the print function in a for loop:

 for (j in seq_along(dat_list[[2]])) {
    print(dat_list[[2]][[j]])
 }

However in R Markdown I cannot. I tried using print and return, but it is not giving me the right output (print does not print a flextable, and return, returns only the first table). How should I do this?

---
output: word_document
---

My example data:

```{r}

library(data.table)
library(flextable)
datA <- fread("anyvar somevar
               2  4
               2  3
               2  5")

dat_list <- list("one" = list("datA" = datA, "datB" = 2*datA),"two" = list("datC" = 3*datA, "datD" = 4*datA), "three" = list("datE" = 5*datA, "datF" = 6*datA))


for (i in seq_along(dat_list) ) {
  for (j in seq_along( dat_list[[i]] ) ) {
    dat_list[[i]][[j]] <- flextable( dat_list[[i]][[j]] )
  }
}

```

Print function

```{r, echo=FALSE}

 for (j in seq_along(dat_list[[2]])) {
    print(dat_list[[2]][[j]])
    cat("\n\newpage\n")
 }
```

Return function

```{r, echo=FALSE}

 for (j in seq_along(dat_list[[2]])) {
    return(dat_list[[2]][[j]])
    cat("\n\newpage\n")
 }
```

Solution

  • Based on this answer you could use knitr::knit_print and add results='asis' to the chunk options. Also note that we have to use \\newpage to add the page break.

    ---
    output: word_document
    ---
    
    ```{r echo=FALSE}
    library(data.table)
    library(flextable)
    datA <- fread("anyvar somevar
                   2  4
                   2  3
                   2  5")
    
    dat_list <- list("one" = list("datA" = datA, "datB" = 2 * datA), "two" = list("datC" = 3 * datA, "datD" = 4 * datA), "three" = list("datE" = 5 * datA, "datF" = 6 * datA))
    
    
    for (i in seq_along(dat_list)) {
      for (j in seq_along(dat_list[[i]])) {
        dat_list[[i]][[j]] <- flextable(dat_list[[i]][[j]])
      }
    }
    ```
    
    ```{r, echo=FALSE, results='asis'}
    for (j in seq_along(dat_list[[2]])) {
      cat(knitr::knit_print(dat_list[[2]][[j]]))
      cat("\n\\newpage\n")
    }
    ```
    

    enter image description here