【问题标题】:Determine if DT datatable is clicked in shiny app确定是否在闪亮的应用程序中单击了 DT 数据表
【发布时间】:2016-07-08 01:28:51
【问题描述】:

这是我尝试获取表格点击事件的一个工作示例:

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点击事件。

标签: r shiny dt


【解决方案1】:

我认为这可能会有所帮助

尝试添加callbackShiny.onInputChange 并添加一直在变化的 smth (rnd)

smt 喜欢

   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

PS。在数据表中的索引从 0 开始。

【讨论】:

  • 如果您的表格在多个页面上,input$rows[1] 将引用当前页面的行。要获取observeEvent 中的绝对行号,请使用input$table_rows_current[input$rows[1]+1],请参阅rstudio.github.io/DT/shiny.html
猜你喜欢
  • 2021-05-05
  • 2018-02-01
  • 2018-08-04
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 2017-07-10
相关资源
最近更新 更多