闪亮的模块,用于基于事件生成具有交互作用的DT对象

时间:2018-11-13 10:30:10

标签: r shiny shiny-reactivity

我正在构建一个具有多个“可编辑”表的闪亮应用程序,用户可以在其中添加新行,编辑现有行并将该数据写回到数据源。

我一直在编写模块以保持代码分离,因此我有一个用于“用户”的模块,并且我想让用户表利用“ editableDT”模块。

基于Yihui's shiny-proxy example,我看到了表格和“添加”按钮,但似乎未触发watch事件。

该模块如何进行修改,以使内部模块能够观察按钮按下情况?

Gist of code

包含代码以方便阅读:

editableDT <- function(input
                       , output
                       , session
                       , table) {
  output$table <- DT::renderDataTable(table(),
                                      server = FALSE)

  proxy <- DT::dataTableProxy("table")

  observeEvent(input$add, {
    proxy %>% addRow(table()[1, ])
  })

}

editableDTInput <- function(id) {
  ns <- NS(id)
  tagList(actionButton(ns("add"), "Add Row"))
}

users <- function(input
                  , output
                  , session) {
  users <- reactive({
    iris
  })

  user <- callModule(editableDT, "usertbl", users)
  output$tblui <- renderUI(tagList(editableDTUI(session$ns("usertbl"))))
}

usersUI <- function(id) {
  ns <- NS(id)
  tagList(editableDTInput("usertbl"),
          uiOutput(ns("tblui")))
}

ui <- function() {
  fluidPage(usersUI("sample"))
}

server <- function(input, output, session) {
  callModule(users, "sample")
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

您没有提供editableDTUI。我认为是

editableDTUI <- function(id) {
  ns <- NS(id)
  DTOutput(ns("table"))
}

该应用在替换后即可运行

usersUI <- function(id) {
  ns <- NS(id)
  tagList(editableDTInput("usertbl"),
          uiOutput(ns("tblui")))
}

usersUI <- function(id) {
  ns <- NS(id)
  tagList(editableDTInput(ns("usertbl")),
          uiOutput(ns("tblui")))
}