R: why kable doesn't print inside a for loop?
Asked Answered
B

1

30

I'm working a report with rmarkdown and latex. I need to print a group of tables using knitr::kable, but the don't print when inside a for loop.

This is my code:

---
title: "project title"
author: "Mr. Author"
date: "2016-08-30"
output: 
  pdf_document: 
    latex_engine: xelatex
bibliography: biblio.bib
header-includes:
   - \usepackage{tcolorbox}
---

Text and chunks that run ok.

```{r loadLibraries}
require(data.table)
require(knitr)
```

## Try to print a group of tables from split

```{r results = "asis"}
t1 <- data.table(a = sample(letters, 10, T), b = sample(LETTERS[1:3], 10, T))
t2 <- split(t1, t1$b)

for (i in 1:length(t2)){
    kable(t2[[i]], col.names = c("A", "B"))
}
```

It doesn't matter if I use results = "asis" or if I omit it altogether, nothing prints to the document.

I've tried enclosing the kable call within a print call (print(kable(t2[[i]]...), and it successfully prints the output to the document, but the format is the same format as a standard R prompt (preceded by ##, for example), which is rather ugly.

How can I display the tables, other than manually?

### EDIT ###

Some answerers have redirected me to R knitr print in a loop as a duplicate answer. It's not, because as I stated in the previous paragraph, this effectively prints the table, but the format is not the expected one. The accepted answer (and related github thread) really solved the problem.

Bitch answered 22/9, 2016 at 23:5 Comment(3)
Other than you describe in your second-to-last paragraph, the print call does the trick. I suppose you forgot to set results="asis" when you tried this.Norinenorita
Possible duplicate of R knitr print in a loopNorinenorita
This is recommended reading to all those landing on this question: yihui.org/en/2017/06/top-level-r-expressionsBitch
A
33

This question is addressed here: https://github.com/yihui/knitr/issues/886

All you need is a line break after each print call

---
title: "project title"
author: "Mr. Author"
date: "2016-08-30"
output: 
  pdf_document: 
    latex_engine: xelatex
    bibliography: biblio.bib
    header-includes:
       - \usepackage{tcolorbox}
---

Text and chunks that run ok.

```{r loadLibraries}
require(data.table)
require(knitr)
```

```{r results = "asis"}
t1 <- data.table(a = sample(letters, 10, T), b = sample(LETTERS[1:3], 10, T))
t2 <- split(t1, t1$b)

for (i in 1:length(t2)){
    print(kable(t2[[i]], col.names = c("A", "B")))
    cat("\n")
}
```
Autolycus answered 22/9, 2016 at 23:26 Comment(2)
I don't know about the situation in 2014, but nowadays the cat is not required. It's just the print statement that is missing in the code from the question.Norinenorita
Using kable instead a loop is also discussed here: bookdown.org/yihui/rmarkdown-cookbook/kable.htmlMyrica

© 2022 - 2024 — McMap. All rights reserved.