Определите, нажимается ли DT datatable в блестящем приложении

Вот рабочий пример моей лучшей попытки получить событие щелчка по таблице:

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 реагирует, только если пользователь нажимает на ячейку, которая отличается от ранее нажатой. Есть ли способ получить событие при любом щелчке стола?


person danas.zuokas    schedule 21.03.2016    source источник
comment
Поскольку вывод в конечном итоге представляет собой div на веб-странице, я полагаю, что вы можете использовать Javascript, чтобы поймать событие щелчка div.   -  person Xiongbing Jin    schedule 21.03.2016


Ответы (1)


Я думаю, это может быть полезно

Попробуйте добавить callback с Shiny.onInputChange и добавить что-нибудь, что менялось за все время (rnd)

smt like

   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())

    })}
))

Затем проанализируйте все row и col из input$rows

PS. в таблицах данных индекс начинается с 0.

person Batanichek    schedule 21.03.2016
comment
Если ваша таблица находится на нескольких страницах, input $ rows [1] будет ссылаться на строку текущей страницы. Чтобы получить абсолютный номер строки в observeEvent, используйте input$table_rows_current[input$rows[1]+1], см. rstudio.github.io/DT/shiny. html - person Valentas; 10.04.2017