【问题标题】:How do I include `kable_classic_2()` properly in Shiny?如何在 Shiny 中正确包含 `kable_classic_2()`?
【发布时间】:2021-03-27 12:50:33
【问题描述】:

根据kableExtra文档,这段代码应该能正确输出表格,

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_classic_2() %>% 
       add_header_above(c(" ", "Group 1" = 5, "Group 2" = 6))
   }
}

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

但是,输出与表格主题 kable_classic_2() 不对应。所以我更改了output$mtcars_kable,使其直接打印HTML-codes,如下所示,


library(shiny)

ui <- fluidPage(
    
    # Application title
    titlePanel("mtcars"),
    
    sidebarLayout(
        sidebarPanel(
            sliderInput("mpg", "mpg Limit",
                        min = 11, max = 33, value = 20)
        ),
        
        mainPanel(
            uiOutput("mtcars_kable")
        )
    )
)

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

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

但是,这只会输出HTML 代码,而不是将它们呈现到实际表格中。我想要的输出是在替代主题下找到的 here

【问题讨论】:

    标签: r shiny kable kableextra


    【解决方案1】:

    看来闪亮不需要 kableExtra css ?

    您从这里提到 doc: https://cran.r-project.org/web/packages/kableExtra/vignettes/use_kable_in_shiny.html

    用户界面中的tableOutput,以及服务器中的简单function(),返回过滤后的结果。

    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_classic_2() %>% 
            add_header_above(c(" ", "Group 1" = 5, "Group 2" = 7))
        }
      )
    }
    
    # Run the application
    shinyApp(ui = ui, server = server)
    

    最好像这样构建汽车专栏:

        mtcars %>%
          as_tibble(rownames = "car") %>% 
          select(car, everything()) %>%
    

    要有一个没有行名的小标题。

    所以,就像您在 cmets 中所指出的,来自 kableExtra 的 css 样式根本不会被渲染。 (我已经测试了更新所有包以查看是否有变化,但没有)。

    gt 包的其他解决方案

    另一个选择是迁移到 gt 包,您可以在其中完全编辑 css...结果非常干净,但显然它不是您问题的 kableExtra 解决方案。

    ui <- fluidPage(
      
      # Application title
      titlePanel("mtcars"),
      
      sidebarLayout(
        sidebarPanel(
          sliderInput("mpg", "mpg Limit",
                      min = 11, max = 33, value = 20)
        ),
        
        mainPanel(
           gt::gt_output("mtcars_kable")
        )
      )
    )
    
    server <- function(input, output) {
      library(dplyr)
      library(kableExtra)
      output$mtcars_kable <- gt::render_gt({
        req(input$mpg)
        mtcars %>%
          as_tibble(rownames = "car") %>% 
          select(car, everything()) %>%
          filter(mpg <= input$mpg) %>%
          gt::gt(id = "cars") %>% 
          gt::tab_spanner(
            label = "Group 1",
            columns = 2:6) %>% 
          gt::tab_spanner(
            label = "Group 2",
            columns = 6:12) %>% 
          gt::opt_css(
            css = "
        #cars .gt_table {
          background-color: #fffggg;
        }
        #cars .gt_row {
          padding: 4px 12px;
        }
        #cars .gt_col_heading {
          text-align: center !important;
        }
        ")
      })
    }
    

    【讨论】:

    • 感谢您的意见。你运行我的代码了吗?我得到与你完全相同的输出;但与实际预期输出不一致。
    • 好的,使用您的第一个代码,我得到“htmlTable_add_header_above 中的错误:您提供的新标题行与原始 kable 输出的总列数不同。”你到底期待什么?抱歉,我可能没有理解重点
    • 好的,我明白了。对不起..这可能是一个css问题,我也有。结果,测试另一种 kableExtra 样式会给出相同的“基本”表...
    • 别担心。一种解决方法是通过 markdown 渲染表格,然后在 Shiny 中重新加载它。但这就像用陌生人的脚挠你的耳朵:-)
    • 最后,据我所知,如果它对其他人有用的话,我用 gt 包的另一个代码编辑了我的答案。而且我还没有在 kableExtra github 上找到关于这个的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 2017-10-27
    • 2019-07-25
    • 1970-01-01
    • 2021-01-27
    相关资源
    最近更新 更多