如何将点击侦听器附加到 DT 和 Shiny 中的数据表?

How do I attach a click listener to a datatable in DT and Shiny?

我有一个闪亮的应用程序,我尝试将 click 侦听器附加到 datatable 行。

这是我的代码:

require(DT)
require(data.table)

ui <- fluidPage(
    fluidRow(
        titlePanel("Data Explorer")
    ),
    fluidRow(
        column(
            DT::dataTableOutput("listTable"),
            width = 4
        ),
        column(
            width = 8
        )
    )
)

get.data <- function() {
    res <- data.table(a = c(1,2,3), b = c(4,5,6))
    return(res)
}

server <- function(input, output) {
    output$listTable <- DT::renderDataTable({
        showModal(modalDialog("Fetching Data..."))
        dt <- datatable(get.data(), 
                        rownames = FALSE, 
                        options = list(autoWidth = TRUE,
                                       selection = 'none',
                                       callback = JS("$('#listTable tbody').on('click.dt', 'tr', function() { console.log('foo'); })")))
        removeModal()
        return(dt)
    })
}

shinyApp(ui = ui, server = server)

我通过谷歌搜索找到的所有示例都使用隐式提供的 table 变量来查找根元素,但是当我尝试这样做时,我只得到一个 ReferenceError: table is not defined.

所以我改用直接 JQuery 搜索。当我使用 console.log('foo') 作为回调时,它工作正常。但是当我像上面那样尝试附加一个监听器时,它没有附加。当我将完全相同的代码复制并粘贴到页面上的 Firefox 控制台时,它起作用了。

这里有什么问题?

callbackdatatable函数的参数,不属于options列表。所以你必须这样做:

dt <- datatable(
  get.data(), 
  rownames = FALSE, 
  callback = JS("table.on('click', 'tr', function() { alert('foo'); })"),
  options = list(
    autoWidth = TRUE,
    selection = 'none'
  )
)