R Shiny 中 DT::datatable() 中冻结 header 问题的解决方法
Workaround for issues with freezing header in DT::datatable() in R Shiny
我在 R Shiny 应用程序中使用 DT::datatable() 来呈现 table,其中 header 和第一列已修复。我的应用程序有多个选项卡。我尝试了两种不同的方法,但都存在导致它们无法使用的错误。我知道已经报告了这些问题,但我想知道是否有人知道适合我的情况的解决方法。
方法#1:scrollY
这里我在options里面设置了scrollY = "500px"
。问题是,当我将条目数更改为 10 以外的其他内容时,当我滚动到底部时,第一列与其他列未对齐。
require(shiny)
require(DT)
shinyApp(
ui = tabsetPanel(
tabPanel(
title = "Tab 1",
fluidPage(
DTOutput("table1")
)
),
tabPanel(
title = "Tab 2",
fluidPage(
plotOutput("myPlot"),
DTOutput("table2")
)
)
),
server = function(input, output, session) {
output$table1 <- DT::renderDataTable({
myData <- cbind(iris, iris, iris, iris)
colnames(myData) <- paste0("Column ", 1:ncol(myData))
DT::datatable(
data = myData,
extensions = "FixedColumns",
rownames = F,
options = list(
scrollX = T,
scrollY = "500px",
fixedColumns = list(leftColumns = 1)
)
)
})
output$myPlot <- renderPlot({
plot(1:10, 1:10)
})
output$table2 <- DT::renderDataTable({
DT::datatable(iris)
})
}
)
方法 # 2:固定标头扩展
这里我使用了FixedHeader扩展,并在选项中设置了fixedHeader = T
。这避免了方法 # 1 的问题,但它有一个更严重的问题。 table 中的固定 header 出现在其他选项卡上。在此示例中,如果我向下滚动选项卡 1 上的 table,headers 会按预期保持固定,但是当我切换到选项卡 2 并向下滚动时,固定的 headers 来自选项卡 1 上的 table 出现在选项卡 2 上。
require(shiny)
require(DT)
shinyApp(
ui = tabsetPanel(
tabPanel(
title = "Tab 1",
fluidPage(
DTOutput("table1")
)
),
tabPanel(
title = "Tab 2",
fluidPage(
plotOutput("myPlot"),
DTOutput("table2")
)
)
),
server = function(input, output, session) {
output$table1 <- DT::renderDataTable({
myData <- cbind(iris, iris, iris, iris)
colnames(myData) <- paste0("Column ", 1:ncol(myData))
DT::datatable(
data = myData,
extensions = c("FixedColumns", "FixedHeader"),
rownames = F,
options = list(
scrollX = T,
fixedHeader = T,
fixedColumns = list(leftColumns = 1)
)
)
})
output$myPlot <- renderPlot({
plot(1:10, 1:10)
})
output$table2 <- DT::renderDataTable({
DT::datatable(iris)
})
}
)
将 DT 从 0.19 版更新到 0.20 版(2021 年 11 月 15 日发布)解决了问题,因此方法 #1 可以正常工作。
我在 R Shiny 应用程序中使用 DT::datatable() 来呈现 table,其中 header 和第一列已修复。我的应用程序有多个选项卡。我尝试了两种不同的方法,但都存在导致它们无法使用的错误。我知道已经报告了这些问题,但我想知道是否有人知道适合我的情况的解决方法。
方法#1:scrollY
这里我在options里面设置了scrollY = "500px"
。问题是,当我将条目数更改为 10 以外的其他内容时,当我滚动到底部时,第一列与其他列未对齐。
require(shiny)
require(DT)
shinyApp(
ui = tabsetPanel(
tabPanel(
title = "Tab 1",
fluidPage(
DTOutput("table1")
)
),
tabPanel(
title = "Tab 2",
fluidPage(
plotOutput("myPlot"),
DTOutput("table2")
)
)
),
server = function(input, output, session) {
output$table1 <- DT::renderDataTable({
myData <- cbind(iris, iris, iris, iris)
colnames(myData) <- paste0("Column ", 1:ncol(myData))
DT::datatable(
data = myData,
extensions = "FixedColumns",
rownames = F,
options = list(
scrollX = T,
scrollY = "500px",
fixedColumns = list(leftColumns = 1)
)
)
})
output$myPlot <- renderPlot({
plot(1:10, 1:10)
})
output$table2 <- DT::renderDataTable({
DT::datatable(iris)
})
}
)
方法 # 2:固定标头扩展
这里我使用了FixedHeader扩展,并在选项中设置了fixedHeader = T
。这避免了方法 # 1 的问题,但它有一个更严重的问题。 table 中的固定 header 出现在其他选项卡上。在此示例中,如果我向下滚动选项卡 1 上的 table,headers 会按预期保持固定,但是当我切换到选项卡 2 并向下滚动时,固定的 headers 来自选项卡 1 上的 table 出现在选项卡 2 上。
require(shiny)
require(DT)
shinyApp(
ui = tabsetPanel(
tabPanel(
title = "Tab 1",
fluidPage(
DTOutput("table1")
)
),
tabPanel(
title = "Tab 2",
fluidPage(
plotOutput("myPlot"),
DTOutput("table2")
)
)
),
server = function(input, output, session) {
output$table1 <- DT::renderDataTable({
myData <- cbind(iris, iris, iris, iris)
colnames(myData) <- paste0("Column ", 1:ncol(myData))
DT::datatable(
data = myData,
extensions = c("FixedColumns", "FixedHeader"),
rownames = F,
options = list(
scrollX = T,
fixedHeader = T,
fixedColumns = list(leftColumns = 1)
)
)
})
output$myPlot <- renderPlot({
plot(1:10, 1:10)
})
output$table2 <- DT::renderDataTable({
DT::datatable(iris)
})
}
)
将 DT 从 0.19 版更新到 0.20 版(2021 年 11 月 15 日发布)解决了问题,因此方法 #1 可以正常工作。