Since the output is just HTML, it’s very easy to use kable and kableExtra in the Shiny environment. For example:

library(shiny)

ui <- fluidPage(

   # Application title
   titlePanel("mtcars"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("mpg", "mpg Limit",
                     min = 11, max = 33, value = 20)
      ),

      mainPanel(
         tableOutput("mtcars_kable")
      )
   )
)

server <- function(input, output) {
  library(dplyr)
  library(kableExtra)
   output$mtcars_kable <- function() {
     req(input$mpg)
     mtcars %>%
       mutate(car = rownames(.)) %>%
       select(car, everything()) %>%
       filter(mpg <= input$mpg) %>%
       knitr::kable("html") %>%
       kable_styling("striped", full_width = F) %>%
       add_header_above(c(" ", "Group 1" = 5, "Group 2" = 6))
   }
}

# Run the application
shinyApp(ui = ui, server = server)

You can copy/paste the code above or simply run:

shiny::runGist("https://gist.github.com/haozhu233/9e675e1a8a1bb4744f9ebc9246a2366b")