首页 > 解决方案 > 在某些行号之后,闪亮的 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 错误,因此某些东西一定只是默默地死去。是什么赋予了?!

标签: javascripthtmlrshinydatatables

解决方案


推荐阅读