0

这篇文章之后,我想知道为什么当我单击单元格呈现按钮时不会触发showModal()内部?observeEvent()我给按钮一个固定的 ID '字符',observeEvent()然后打开模态框。但它没有。

如果我在 ShinyApp UI 中放置一个按钮,会在哪里对observeEvent()inputid 做出反应,或者如果我将它放在可反应中,那么区别在哪里?

library(shiny)
library(reactable)
library(tidyverse)

data = dplyr::starwars %>%
  select(name, height, mass, sex, species, homeworld)

ui = fluidPage(
  
  column(width = 6, style = "margin-top: 50px;",
  reactableOutput("table"))
  
)

server = function(input, output, session){

  
  output$table = renderReactable({
    reactable(data = data,
              height = 600,
              defaultPageSize = 20,
              columns = list(
                name = colDef(
                  cell = function(value){
                    div(htmltools::tags$button(value, class = "action-button", id = "character"))
                  })))})
  
  observeEvent(input$character, {
  showModal(modalDialog(title = "Test"))
  })
}

shinyApp(ui, server)
4

1 回答 1

0

reactable 包提供了许多示例,您可以如何使用它,包括每行中的自定义操作。该示例有一个“详细信息”列,它显示了看起来像按钮的元素。使用 Javascript 函数,它可以识别对详细信息列的点击并采取相应的行动。

将此作为附加参数添加reactablerenderReactable.

reactable(
  data = data,
  height = 600,
  defaultPageSize = 20,
  ...
  onClick = JS("function(rowInfo, colInfo) {
    // Only handle click events on the 'details' column
    if (colInfo.id !== 'details') {
      return
    }

    // Send the click event to Shiny
    if (window.Shiny) {
      Shiny.setInputValue('foo', 'bar')
    }
  }")
)

Shiny.setInputValue("foo", "bar")将导致服务器的 input$foo 设置为“bar”。这会导致一个 Shiny 事件,您可以在服务器中捕获该事件,例如,使用观察者。有关详细信息,请参阅本教程关于 R 中的 Javascript

请注意:reactable 的作者不建议使用它,因为“键盘用户当前无法访问自定义点击操作”(引自手册 2021-10-16)。如果可访问性或其他使用键盘的原因与您无关,您可以使用此解决方案。

关于“类”解决方案的注意事项:我不建议使用class = "action-button",因为我认为它是一个脆弱的构造。这不是创建输入绑定的正确方法,我很惊讶它完全有效。

我所知道的唯一正式支持表格行中的按钮的包是带有Buttons 扩展名的DataTables

于 2021-10-16T10:33:39.210 回答