确定在shiny应用程序中是否单击了DT datatable

6

以下是我尝试获取表格点击事件的最佳实现示例:

library(shiny)
library(DT)

runApp(shinyApp(
  ui = fluidPage(DT::dataTableOutput('table')),
  server = function(input, output, session) {
    output$table <- DT::renderDataTable({
      dt <- data.frame(a = 1)
      datatable(dt, rownames = FALSE, selection = 'none')
    })
    observeEvent(input$table_cell_clicked, {
      print(Sys.time())
    })}
))

问题在于observeEvent只有在用户点击与先前不同的单元格时才会触发反应。是否有办法在任何表格点击事件上获取事件?

由于输出最终是网页上的一个div,我想您可以使用Javascript来捕获div点击事件。 - Xiongbing Jin
1个回答

10

我认为这可能会有所帮助。

尝试使用 Shiny.onInputChange 添加 callback,并添加随时更改的内容(rnd)。

类似于:

   JS("table.on('click.dt', 'td', function() {
            var row_=table.cell(this).index().row;
            var col=table.cell(this).index().column;
            var rnd= Math.random();
            var data = [row_, col, rnd];
           Shiny.onInputChange('rows',data );
    });")

然后就可以像这样使用它:
library(shiny)
library(DT)
runApp(shinyApp(
  ui = fluidPage(DT::dataTableOutput('table')),
  server = function(input, output, session) {
    output$table <- DT::renderDataTable({
      datatable(data.frame(a = c(1,2),b=c(2,3)), rownames = FALSE, selection = 'none', callback = JS("table.on('click.dt', 'td', function() {
            var row_=table.cell(this).index().row;
            var col=table.cell(this).index().column;
            var rnd= Math.random();
            var data = [row_, col, rnd];
           Shiny.onInputChange('rows',data );
    });")
      )}
    )

    observeEvent(input$rows, {
      print(input$rows)
      print(Sys.time())

    })}
))

然后从input$rows中解析所有的rowcol

注:在datatables中索引从0开始。


2
如果你的表格跨越了多个页面,input$rows[1]将引用当前页面的行。为了在observeEvent中获取绝对行号,请使用input$table_rows_current[input$rows[1]+1],参见 https://rstudio.github.io/DT/shiny.html。 - Valentas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接