【问题标题】:R shiny - DT::renderDataTable column widthR 闪亮 - DT::renderDataTable 列宽
【发布时间】:2016-01-02 12:33:39
【问题描述】:

我正在制作一个闪亮的应用程序,但遇到了一个小但令人恼火的问题。我产生的部分输出是使用DT::renderDataTable 输出的。只有两列,第一列的宽度将取决于输入数据集,所以我不想绝对将宽度固定为任何东西。我见过this 线程,其中一个答案中的代码在某种程度上有效。但是,如果我再次按下 actionButton,表格会自行调整大小以填充输出窗口的整个宽度。

有没有办法防止表格在再次按下操作按钮后自行调整大小?我知道只使用renderTabletableOutput 可以解决问题,但我喜欢dataTableOutput,并且更喜欢使用该功能。

对于 MWE:

library("shiny")
library("DT")

mwe_ui <- shinyUI(fluidPage(
    sidebarLayout(
    sidebarPanel(
      titlePanel("Example"),
      sliderInput(inputId = "df",
                  label = "Degrees of Freedom:",
                  min=1 , max=50 , value=1 , step=1
      ),
      actionButton(inputId = "compute1",
                   label = "Sample"
      )
    ),
    mainPanel(
      dataTableOutput( outputId = "summary" )
    )
  )))

mwe_server <- function(input, output) {

  temp01  <- reactive({
    compute1 <- input$compute1
    if( compute1 > 0 ){
      isolate({
        aa <- round( runif(6, 4,20 ) )
        bb <- character()
        for( ii in 1:6 ){
          bb[ii] <- paste0(sample(letters, size=aa[ii]), collapse="")
        }
        xx <- matrix( round(rt(6, df=input$df), 4), nrow=6, ncol=1 )
        return( data.frame(xx) )
      })
    }
  }) 

  ##############

  output$summary <-  DT::renderDataTable({
    temp02 <- temp01()
  }, rownames=FALSE,
  options = list(autoWidth = TRUE, 
                    columnDefs = list(list(width = "125px", targets = "_all"))
                    )
  )

}


runApp( list(ui=mwe_ui, server=mwe_server) )

【问题讨论】:

  • 我看到您将宽度预先固定为125px,为什么不为表格修复它?
  • 据我了解,125px 的宽度不是绝对固定宽度,只是“首选”宽度。在我制作的实际应用程序中,我使用了那些精确的列宽规范,并且第一列能够比第二列宽得多。我已经编辑了示例以具有一些不同长度的字符串来说明我的意思。指定表格宽度是定义绝对宽度,还是会扩展到表格的内容?
  • 我不敢相信这没有直接的解决方案,比如 Rhandsontable 中的 manualcolumnresize

标签: r shiny


【解决方案1】:

您可以在 ui 函数中添加 width 参数,而不是在服务器的 columnDefs 中?

library("shiny")
library("DT")

mwe_ui <- shinyUI(fluidPage(
  sidebarLayout(
    sidebarPanel(
      titlePanel("Example"),
      sliderInput(inputId = "df",
                  label = "Degrees of Freedom:",
                  min=1 , max=50 , value=1 , step=1
      ),
      actionButton(inputId = "compute1",
                   label = "Sample"
      )
    ),
    mainPanel(
      dataTableOutput( outputId = "summary" , width="125px")
    )
  )))

mwe_server <- function(input, output) {

  temp01  <- reactive({
    compute1 <- input$compute1
    if( compute1 > 0 ){
      isolate({
        aa <- round( runif(6, 4,20 ) )
        bb <- character()
        for( ii in 1:6 ){
          bb[ii] <- paste0(sample(letters, size=aa[ii]), collapse="")
        }
        xx <- matrix( round(rt(6, df=input$df), 4), nrow=6, ncol=1 )
        return( data.frame(xx) )
      })
    }
  }) 

  ##############
  output$summary <-  DT::renderDataTable({
    temp02 <- temp01()
  }, rownames=FALSE,
  options = list(autoWidth = TRUE)
  ) 
}

runApp( list(ui=mwe_ui, server=mwe_server) )

【讨论】:

    猜你喜欢
    • 2020-09-18
    • 2019-05-03
    • 2017-05-25
    • 2014-07-06
    • 2018-07-30
    • 2017-05-05
    • 1970-01-01
    • 2020-12-26
    • 2021-09-02
    相关资源
    最近更新 更多