Rob Creel
Rob Creel

Reputation: 573

In RMarkdown, why is the kable table printing below the header here?

I'm trying to generate a report with each row of a tibble printing vertically in a table on its own page using a for loop. The tables are printing fine, but I want to put headers at the top of each page (and eventually, text). Since the line of code to print the header (which appears as a header in my own document but not in my reprex, not sure why) is above the line of code to print the table, using kable, I expect the header to print above the table. I suspect kable is doing something I don't understand behind the scenes but I cannot determine what.

What am I doing wrong, and how may I print headers at the top of each page?

I've provided below: a screenshot of the current output.

Relevant portion:

---
title: "kable-order-reprex"
author: "Rob Creel"
date: "6/4/2021"
output: pdf_document
---
 
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(magrittr)
library(kableExtra)
```
 
 
```{r chunk1, echo=FALSE, results='asis'}
for (i in 1:nrow(mtcars)) {
  # Generate Table
  mtcars %>%
    slice(1) %>%
    stack() %>%
    select(ind, values) %>%
    kable(col.names = NULL) %>%
    kable_styling() -> my_table
 
  cat("\n\n\\pagebreak\n")
 
  # Print Header
  cat(paste0("## ", mtcars %>% rownames() %>% extract2(i)))
 
  # Print Table
  print(my_table)
  cat("\n\n\\pagebreak\n")
}
```

Pic of mis-ordered output.:

Upvotes: 1

Views: 1751

Answers (1)

henrik_ibsen
henrik_ibsen

Reputation: 813

As far as I can tell everything is working as intented. The problem is float management in LaTeX.

You can change the behaviour of the kable output by setting the argument latex_options in kable_styling(). E.g.

mtcars %>%
  slice(1) %>%
  stack() %>%
  select(ind, values) %>%
  kable(col.names = NULL) %>%
  #Use either "hold_position" or "HOLD_position"
  kable_styling(latex_options = "hold_position") -> my_table

hold_position corresponds to h, while HOLD_position is H, (read more about float options here), where H is stricter than h and forces the position of the float output to be at the position where it is in the code. Also see ?kable_styling (latex_options entry)

See similar question with answer here

Upvotes: 0

Related Questions