渲染 JavaScript 破坏了 R Shiny DT (DataTable) 中的页面导航和反应功能
Rendering JavaScript breaks page navigation and reactive function in R Shiny DT (DataTable)
我有一个用 R Shiny 构建的数据table,并使用我的反应函数 filteredData()
动态渲染数据。我从 Azure SQL 引入的数据有几个包含大量 nvarchar 文本的列(索引 3 和 29);这段文字破坏了 table 的视觉美感,让查看多行变得很痛苦。我的解决方案是将这些列的单元格中的可见文本限制为 200 个字符,并将其余部分显示为悬停时的工具提示。
output$table1 <- renderDT(
DT::datatable(filteredData(),
selection = "single",
escape = FALSE,
style = "bootstrap4",
rownames = FALSE,
options = list(
dom = 'rtip',
scrollX=TRUE,
autoWidth = TRUE,
searching=FALSE,
ordering=TRUE,
bFilter = FALSE,
pageLength = 5,
columnDefs = list(list(
targets = c(3, 28),
width = '600px'
# THIS BREAKS THE TABLE, CANNOT GO TO *NEXT* PAGE
,render = JS(
"function(data, type, row, meta) {",
"return type === 'display' && data.length > 200 ?",
"'<span title=\"' + data + '\">' + data.substr(0, 200) + '...</span>' : data;",
"}")
)))
))
此解决方案有效(有点)。文本会按预期截断并在悬停时显示工具提示,但随后会破坏允许用户转到数据中的下一页或上一页的内置按钮table(现在我正在限制我的数据table 每页 5 条记录)。当我单击 'next' 时,屏幕中间会弹出一个半透明的小 window 并显示“处理中”,但卡在这个循环中。 它也破坏了我对数据的反应性过滤。 注释掉有问题的 Javascript
#,render = JS(
# "function(data, type, row, meta) {",
# "return type === 'display' && data.length > 200 ?",
# "'<span title=\"' + data + '\">' + data.substr(0, 200) + '...</span>' : data;",
# "}")
修复了页面导航,但我没有工具提示或文本截断。我已经检查了 DT 网站上的文档,除了我的反应性 SQL 派生数据外,不明白我在做什么不同。
编辑:我正在使用这些包,因为它的价值:shinymanager
、tidyverse
、DT
、bs4Dash
。我还在 dashboardBody()
.
中调用了 shinyjs::useShinyjs()
我不知道发生了什么,但你可以试试 ellipsis 插件:
library(DT)
dat <- data.frame(
A = c("fnufnufroufrcnoonfrncacfnouafc", "fanunfrpn frnpncfrurnucfrnupfenc"),
B = c("DZDOPCDNAL DKODKPODPOKKPODZKPO", "AZERTYUIOPQSDFGHJKLMWXCVBN")
)
datatable(
dat,
plugins = "ellipsis",
options = list(
columnDefs = list(list(
targets = c(1, 2),
render = JS("$.fn.dataTable.render.ellipsis( 200, false )")
))
)
)
我有一个用 R Shiny 构建的数据table,并使用我的反应函数 filteredData()
动态渲染数据。我从 Azure SQL 引入的数据有几个包含大量 nvarchar 文本的列(索引 3 和 29);这段文字破坏了 table 的视觉美感,让查看多行变得很痛苦。我的解决方案是将这些列的单元格中的可见文本限制为 200 个字符,并将其余部分显示为悬停时的工具提示。
output$table1 <- renderDT(
DT::datatable(filteredData(),
selection = "single",
escape = FALSE,
style = "bootstrap4",
rownames = FALSE,
options = list(
dom = 'rtip',
scrollX=TRUE,
autoWidth = TRUE,
searching=FALSE,
ordering=TRUE,
bFilter = FALSE,
pageLength = 5,
columnDefs = list(list(
targets = c(3, 28),
width = '600px'
# THIS BREAKS THE TABLE, CANNOT GO TO *NEXT* PAGE
,render = JS(
"function(data, type, row, meta) {",
"return type === 'display' && data.length > 200 ?",
"'<span title=\"' + data + '\">' + data.substr(0, 200) + '...</span>' : data;",
"}")
)))
))
此解决方案有效(有点)。文本会按预期截断并在悬停时显示工具提示,但随后会破坏允许用户转到数据中的下一页或上一页的内置按钮table(现在我正在限制我的数据table 每页 5 条记录)。当我单击 'next' 时,屏幕中间会弹出一个半透明的小 window 并显示“处理中”,但卡在这个循环中。 它也破坏了我对数据的反应性过滤。 注释掉有问题的 Javascript
#,render = JS(
# "function(data, type, row, meta) {",
# "return type === 'display' && data.length > 200 ?",
# "'<span title=\"' + data + '\">' + data.substr(0, 200) + '...</span>' : data;",
# "}")
修复了页面导航,但我没有工具提示或文本截断。我已经检查了 DT 网站上的文档,除了我的反应性 SQL 派生数据外,不明白我在做什么不同。
编辑:我正在使用这些包,因为它的价值:shinymanager
、tidyverse
、DT
、bs4Dash
。我还在 dashboardBody()
.
shinyjs::useShinyjs()
我不知道发生了什么,但你可以试试 ellipsis 插件:
library(DT)
dat <- data.frame(
A = c("fnufnufroufrcnoonfrncacfnouafc", "fanunfrpn frnpncfrurnucfrnupfenc"),
B = c("DZDOPCDNAL DKODKPODPOKKPODZKPO", "AZERTYUIOPQSDFGHJKLMWXCVBN")
)
datatable(
dat,
plugins = "ellipsis",
options = list(
columnDefs = list(list(
targets = c(1, 2),
render = JS("$.fn.dataTable.render.ellipsis( 200, false )")
))
)
)