R闪亮 - DT :: renderDataTable列宽度

5
我正在使用Shiny制作一个应用程序,遇到了一个小而烦人的问题。我使用DT::renderDataTable输出部分内容。其中只有两列,第一列的宽度将取决于输入数据集,因此我不想将其宽度绝对固定。我看到了这个帖子,其中一个答案中的代码在某种程度上有效。然而,如果我再次按下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) )

我看到你将宽度预设为“125像素”,为什么不对表格进行固定呢? - Pork Chop
据我理解,125px 的宽度并不是绝对固定的宽度,而只是一个“首选”宽度。在我实际制作的应用程序中,我使用了这些确切的列宽规格,第一列比第二列宽得多。我已经编辑了示例,添加了一些长度不同的字符串,以说明我的意思。指定表格宽度是否定义了绝对宽度,或者它会扩展到表格内容? - Jelsema
我简直不敢相信这个问题没有一个直接的解决方案,就像在Rhandsontable中的manualcolumnresize一样。 - Diego
1个回答

0

您可以在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) )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接