在Shiny应用程序中的renderDataTable中如何设置列宽而不拉伸表格?

7
我希望能够得到一个 DataTable(带有所有排名、搜索和分页功能),它不会完全横跨整个页面,在每列中留出大量的空白...最好是列宽类似于 renderTable 中的“wrap”风格...
我知道可以固定相对列宽,但是我的表将根据所选输入的不同列数动态更新。我希望额外的列扩展到右侧的空白处,如果变得比浏览器窗口宽,则触发水平滚动条。
下面是上述图片中表格的可重现示例...
library(shiny)
runApp(list(
  ui = navbarPage(
  title = 'Tables',
  tabPanel('dataTableOutput', dataTableOutput('ex1')),
  tabPanel('tableOutput', tableOutput('ex2'))
),
server = function(input, output) {
  output$ex1 <- renderDataTable(iris)
  output$ex2 <- renderTable(iris)
}
))

我知道这并没有直接回答你的问题,但是RStudio刚刚宣布了htmlwidgets for R,其中包括了许多很酷的东西,包括DataTables。http://www.htmlwidgets.org/showcase_datatables.html - Khashaa
2个回答

8

我认为在dataTables中应该使用drawCallback。这里我只是稍微修改了你的示例,以将dataTable的宽度固定为600px。您可以在回调函数中使用可能的JavaScript函数来实现几乎任何操作。

library(shiny)
runApp(list(
  ui = navbarPage(
    title = 'Tables',
    tabPanel('dataTableOutput', dataTableOutput('ex1')),
    tabPanel('tableOutput', tableOutput('ex2'))
  ),
  server = function(input, output) {
    output$ex1 <- renderDataTable( iris, 
                                   option = list( drawCallback = I("function( settings ) {document.getElementById('ex1').style.width = '600px';}")) )
    output$ex2 <- renderTable(iris)
  }
))

0
假设你的data.framedf,然后将这段代码放在服务器端的reactive/renderTable块的开头。它会将列名包装到理想的长度,从而减小表格的大小。你可以随时更改宽度以达到所需的宽度。
library(stringr)

colnames(df) = str_wrap(colnames(df),width = 10)

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