javascript - 在某些行号之后,闪亮的 DT 数据表 scrollTo 失败
问题描述
我有一个闪亮的应用程序,它使用 DT 来显示一些数据。在某些时候,我有一个行(行号)列表,我想使用附加到数据表对象的按钮直接导航到该列表。我想出了一种方法,但由于某种原因,它只导航到某些行而不是其他行。奇怪的是,它拒绝导航的行似乎一遍又一遍地保持一致。如果我重新运行该应用程序,它每次都无法导航到相同的应用程序。在附加的示例中,我要跳转到的行是 8、10、29、30、68、78、99、103、104、108、109、112、120、122、128。由于某种原因,一旦它得到到 109,scrollTo
在数字循环回到 8 之前, call 什么都不做。我最初用随机顺序的数字尝试了这个,并认为它们需要排序,我尝试了,结果相同。有趣的是,不起作用的行是最高的 5 行(109、112、120、122 和 128)。我看不出它会以这种方式表现的任何原因。有人有任何见识吗?
另外,如果有更好的方法可以做到这一点,我很想知道。通过消息发送行号然后在 javascript 的其他地方循环遍历它们似乎有点笨拙。
只需运行下面的示例并多次点击下一步按钮。您会看到它到达了数据表不再跳转到下一行的点。这些数字都在数据框(iris)的最大行内。
library(shiny)
library(DT)
ui <- shinyUI({
fluidPage(
tags$head(
tags$script("
var row_index = 0;
var view_rows = [];
Shiny.addCustomMessageHandler('set-rows',function(rows) {
view_rows = rows;
row_index = 0;
})
")
),
textOutput("row_list"),
DTOutput("tabs")
)
})
server <- shinyServer(function(input,output,session) {
view_rows <- reactive({
c(111, 9, 108, 77, 67, 7, 103, 28, 98, 29, 121, 119, 127, 102, 107)
# sample(1:nrow(iris),15)
})
output$row_list <- renderText({
paste(view_rows()+1,collapse=", ")
})
observe({
print("sending rows")
session$sendCustomMessage("set-rows",view_rows())
})
output$tabs <- renderDT({
datatable(
iris,
extensions = c("Buttons","Scroller"),
options = list(
dom = 'BfrtSip',
scroller = TRUE,
selection = "single",
scrollY = "60vh",
buttons = list(
list(
extend = "collection",
text = "next",
action = DT::JS("
function ( e, dt, node, config ) {
console.log('going to ' + view_rows[row_index]);
dt.row(view_rows[row_index++]).scrollTo(false);
if (row_index >= view_rows.length) {
row_index = 0;
}
}
")
)
)
)
)
})
})
shinyApp(ui,server)
更新
好的,我已经做了更多的游戏,只是变得更奇怪了。看起来,无论我使用什么数据集,行索引都存在一些上限scrollTo
。如果我只是用整数调用它,则上限显示为 188(实际上是 189,因为行在数据表中是零索引的)。这是我在上一篇文章中给出的示例的更精简版本。此版本按预期工作(即您按下按钮并跳转到一行):
library(shiny)
library(DT)
shinyApp(
ui = shinyUI({
fluidPage(
DTOutput("table")
)
}),
server = shinyServer(function(input,output,session) {
output$table <- renderDT({
datatable(
ChickWeight,
extensions = c("Buttons","Scroller"),
# callback = DT::JS("window.dt = table;"),
options = list(
dom = 'BfrtSip',
scrolle = TRUE,
# paging = TRUE,
selection = "single",
scrollY = "60vh",
buttons = list(
list(
extend = "collection",
text = "next",
action = DT::JS("
function ( e, dt, node, config ) {
dt.row(188).scrollTo(false);
}
")
)
)
)
)
})
})
)
但是如果你把188改成189就不行了。这里发生了什么事?!值得注意的是,如果我在浏览器(而不是 RStudio 弹出窗口)中运行它,Firefox 中的最大数量为89 ,Safari 中的最大数量为98(我能够在这两个浏览器中对其进行测试)。这真的让我发疯!浏览器控制台中没有显示任何 javascript 错误,因此某些东西一定只是默默地死去。是什么赋予了?!
解决方案
推荐阅读
- php - 从 2 个输入转换 laravel 中的时间
- verilog - 将 x(无关)分配给寄存器复位值或组合输出以提高区域效率
- calendar - 在 ICS 日历文件中,我的会议是为所有与会者创建的,但不是为组织者创建的?
- c++ - 函数调用返回指向对象的指针是纯右值吗?
- python - Wagtail - 如何使用不同的模板设置多个路径到相同的模型实例?
- python - 根据第一个字符以外的字段对文件内容进行排序
- wordpress - Wordpress (DIVI) 网站上的 iFrame 实施
- apache-spark - Spark cassendra yugabyte 连接器问题从表中获取记录
- gradle - 为什么我的 Gradle 构建失败并出现“未找到插件 [id: 'org.flywaydb.enterprise.flyway', version: '6.5.0']”错误?
- python-3.x - Python Google oauth2无法连接到代理