问题描述
在尝试过有关该主题的大量先前问题中的建议后,我仍然找不到任何可以接受的方法。
我想有一个数据表,其中第一列为特定宽度,随后的列均具有相同的不同宽度。列数可以变化,因此,当数据表太大时,会出现水平滚动条。这应该与设置columnDefs,autoWidth和scrollX选项有关(可能还有fillContainer似乎从未提及过)。
这是我的尝试:
library(shiny)
library(DT)
library(data.table)
x <- data.table(rbind(
expand.grid(tab = 'tab1',cols = c(LETTERS[1:3]),rows = c(letters[1:5])),expand.grid(tab = 'tab2',cols = c(LETTERS[1:6]),expand.grid(tab = 'tab3',cols = c(LETTERS[1:26]),rows = c(letters[1:5]))
))
x[,value := rpois(.N,10)]
shinyApp(
ui = fluidPage(
selectInput('selected_table','Choose table',choices = unique(x$tab),selected = 'tab2'),DT::dataTableOutput('table',width = '1000px')
),server = function(input,output) {
output$table <- DT::renderDataTable({
y <- dcast(x[tab == input$selected_table],rows ~ cols,value.var = 'value')
print(y)
datatable(y,rownames = FALSE,options = list(
autoWidth = TRUE,scrollX = TRUE,columnDefs = list(
list(width = '160px',targets = 0),list(width = '80px',targets = 1:(ncol(y)-1))
)
)
)
})
}
)
当我尝试使用此'tab1'和'tab2'时,列标题行与表的其余部分未对齐(标题位于页面左侧,主体位于中间)。 'tab3'出现滚动条,然后一切似乎才起作用。有没有办法让它在所有情况下都能正常工作?
下面的Stéphane答案为宽表'tab3'产生了完美的输出,但没有为'tab1'和'tab2'产生固定宽度的列。还有什么可以尝试的吗?
解决方法
该问题的主要原因可能是autoWidth
。将其设置为FALSE
。还将类dt-center
用于列:
options = list(
autoWidth = FALSE,scrollX = TRUE,columnDefs = list(
list(width = '160px',targets = 0),list(width = '80px',targets = 1:(ncol(y)-1)),list(className = "dt-center",targets = "_all")
)
)
在使用自定义宽度时,我建议使用此CSS:
ui = fluidPage(
tags$head(tags$style(HTML("table {table-layout: fixed;}"))),......
,
因此,将此行添加到ui似乎可以解决未对齐的标题行,同时仍保持固定的列宽。
tags$head(tags$style(".datatables .display {margin-left: 0;}"))
您仍然可以看到它创建了填充所有空间的表,然后立即将其缩小为固定宽度,并且底部的页脚线也仍然填充了所有空间,看起来有些奇怪。
如果有人还有其他方法可以做到,我仍然很感兴趣。