【问题标题】:How to keep DT's Caption widget centered relative to mainPanel's width?如何保持 DT 的 Caption 小部件相对于 mainPanel 的宽度居中?
【发布时间】:2021-09-14 13:54:12
【问题描述】:

我试图将标题始终保持在相对于窗口/mainPanel 的宽度的居中位置。当我在宽桌子上折叠sidebarPanel 时,只有这样标题才保持居中。但是当sidebarPanel 未折叠时,与其他DT 小部件不同,标题会更改它的“位置”并出现在右侧。请帮忙。

这是一个代表:

global.R

options(scipen = 99999)

library(shiny)
library(shinyjs)
library(shinyWidgets)
library(dplyr)
library(DT)
library(htmltools)

xyz_query <- dplyr::bind_cols(mtcars, mtcars)

ui.R

fluidPage(
  
  shinyjs::useShinyjs(), 
  
  navbarPage( 
    
    id = "navbar",
    title= "xyz",
    windowTitle = "xyz test",
    
    tabPanel("Dataset",
             
             div(style="display:inline-block",shinyWidgets::materialSwitch(inputId = "toggleSidebar", label = "Filter Panel: ",
                                                                           value = TRUE, status = "warning")),
             
             sidebarLayout(
               sidebarPanel(
                 id = "Sidebar",
                 br(),
                 br()
                 
               ),
               mainPanel(
                 id = "main_panel",
                 DT::DTOutput('panel1_data')
        )
      )
    )
  )
)

服务器.R

function(input, output, session) {
  
  observeEvent(input$toggleSidebar, {
    shinyjs::toggle(id = "Sidebar", condition = input$toggleSidebar)
    if(!isTRUE(input$toggleSidebar)) {
      shinyjs::runjs("$('#main_panel').removeClass('col-sm-8').addClass('col-sm-12')")
    } else {
      shinyjs::runjs("$('#main_panel').removeClass('col-sm-12').addClass('col-sm-8')")
    }
    
  })
  
  output$panel1_data <- DT::renderDT(server = FALSE, {
    DT::datatable(xyz_query,
                  extensions = c('Buttons'),
                  caption = htmltools::tags$caption(style = 'caption-side: top; text-align: center; color:black; font-size:150% ;',
                                                     'MTCARS mtCARS mTcArS MTcars'),
                  options = list(scrollY = 600,
                                 scrollX = TRUE,
                                 dom =  '<"float-left"l><"float-right"f>rt<"row"<"col-sm-4"B><"col-sm-4"i><"col-sm-4"p>>',
                                 lengthMenu=  list(c(10, 25, 50, -1), 
                                                   c('10', '25', '50','All')),
                                 scrollCollapse= TRUE,
                                 lengthChange = TRUE, 
                                 widthChange= TRUE,
                                 rownames = TRUE))})
  
  
}

图片-

【问题讨论】:

    标签: r shiny shinydashboard dt shinyjs


    【解决方案1】:

    如果有办法将表格标题置于可见空间的中心,我无能为力。不过,我可以提供另一种可行的解决方案。

    不要尝试将表格的标题居中,而是在表格之外添加一个标题。我在ui 中为mainPanel 添加了标题。

    下面的代码包括您的原始标题和我添加的内容。您可以在本文底部的前两张图片中看到它。

    在此答案底部的第三张图片中,我删除了您的表格标题。

    library(shiny)
    library(shinyjs)
    library(shinyWidgets)
    library(dplyr)
    library(DT)
    library(htmltools)
    
    xyz_query <- dplyr::bind_cols(mtcars, mtcars)
    shinyApp(
      ui <- fluidPage(
        shinyjs::useShinyjs(), 
        navbarPage( 
          id = "navbar",
          title= "xyz",
          windowTitle = "xyz test",
          tabPanel("Dataset",
                   div(style="display:inline-block",shinyWidgets::materialSwitch(inputId = "toggleSidebar", label = "Filter Panel: ",
                                                        value = TRUE, status = "warning")),
                   sidebarLayout(
                     sidebarPanel(
                       id = "Sidebar",
                       br(),
                       br()
                     ),
                                   # this is where I added to your code
                     mainPanel(h3("MTCARS mtCARS mTcArS MTcars", align="center"),
                       id = "main_panel",
                       DT::DTOutput('panel1_data')
                     )
                   )
          )
        )
      ),
      server <- function(input, output, session) {
        observeEvent(input$toggleSidebar, {
          shinyjs::toggle(id = "Sidebar", condition = input$toggleSidebar)
          if(!isTRUE(input$toggleSidebar)) {
            shinyjs::runjs("$('#main_panel').removeClass('col-sm-8').addClass('col-sm-12')")
          } else {
            shinyjs::runjs("$('#main_panel').removeClass('col-sm-12').addClass('col-sm-8')")
          }
        })
        output$panel1_data <- DT::renderDT(server = FALSE, {
          DT::datatable(xyz_query,
                        extensions = c('Buttons'),
                        caption = htmltools::tags$caption(style = 'caption-side: top; text-align: center; color:black; font-size:150% ;',
                                                          'MTCARS mtCARS mTcArS MTcars'),
                        options = list(scrollY = 600,
                                       scrollX = TRUE,
                                       dom =  '<"float-left"l><"float-right"f>rt<"row"<"col-sm-4"B><"col-sm-4"i><"col-sm-4"p>>',
                                       lengthMenu=  list(c(10, 25, 50, -1), 
                                                         c('10', '25', '50','All')),
                                       scrollCollapse= TRUE,
                                       lengthChange = TRUE, 
                                       widthChange= TRUE,
                                       rownames = TRUE))})
      }
    )
    

    【讨论】:

    • 感谢 Kat 提供的解决方案。虽然这可行,但我正在寻找一种调整标题本身的方法,因为我在这张桌子的顶部有一个可折叠的行。通过添加h3,标题现在多了一行。使用标题,标题成为表格的一部分,我不必担心额外的行。无论如何,如果我没有得到任何其他回应,我可以弄清楚一些事情。但是,现在我想等待更多的答案。再次感谢你,我给了你一个投票:)
    • 感谢 Kat 的帮助!保重。
    猜你喜欢
    • 2018-05-29
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2021-04-18
    • 2013-05-08
    相关资源
    最近更新 更多