building on James_D's answer, here's a way to reshape the long table into a wide columns-of-columns format (using an eclectic mix of base R and tidyverse pieces):
library(dplyr)
library(tidyr)
library(broom)
library(knitr)
parts = 3 ## multi-column parts to display alongside
tidy(interaction) |>
select(term, coefficient = estimate) |>
mutate(part = rep(1:parts, each = ceiling(n()/parts), length.out = n()),
row_index = rep(1:ceiling(n()/parts), length.out = n())
) |>
split(~ part) |>
Reduce(f = \(x, y) x |> select(-part) |> left_join(y, by = 'row_index')) |>
select(-c(row_index, part)) |>
kable()
|term.x | coefficient.x|term.y | coefficient.y|term | coefficient|
|:-------------|-------------:|:------------------------|-------------:|:-------------------------|-----------:|
|(Intercept) | 29.65|factor(hp)180 | -13.35|factor(hp)105:factor(am)1 | NA|
|factor(hp)62 | -5.25|factor(hp)205 | -19.25|factor(hp)109:factor(am)1 | NA|
|factor(hp)65 | 3.50|factor(hp)215 | -19.25|factor(hp)110:factor(am)1 | -1.15|
|factor(hp)66 | -0.55|factor(hp)230 | -14.95|factor(hp)113:factor(am)1 | NA|
|factor(hp)91 | -4.40|factor(hp)245 | -15.85|factor(hp)123:factor(am)1 | NA|
## [...]
You can polish up above output with {htmlTables} as described in this SO answer.