在模块中解除绑定

时间:2016-06-03 17:46:49

标签: r shiny dt

我正在创建一个输出数据集的闪亮模块,并输出带有数据和数字输入的DataTable。我知道,对于DataTables中的输入,您需要在每次重绘表时使用javascript绑定和解除绑定元素,否则您将只能从初始表中读取值。 (https://groups.google.com/forum/#!topic/shiny-discuss/ZUMBGGl1sss)我不知道问题是否与命名空间有关,但我似乎无法让表中的元素在模块内成功取消绑定。这是我的代码:

library(shiny)
library(DT)
# module UI
dtInputUI <- function(id) {
  ns <- NS(id)
  tbl <- DT::dataTableOutput(ns("tbl"))
  btn <- actionButton(ns("btn"),"Submit")
  scrpt1 <- tags$script(HTML(
    "Shiny.addCustomMessageHandler('display', function(html) {
      var w=window.open();
      $(w.document.body).html(html);})"
    ))
  # doesn't appear to work properly
  scrpt2 <- tags$script(HTML(paste0(
    "Shiny.addCustomMessageHandler('unbind-DT', function(id) {
      Shiny.unbindAll($('#'+id).find('table').DataTable().table().node());
    })")))
  tagList(
    btn,tbl,scrpt1,scrpt2
    )
}
# module server
dtInput <- function(input, output, session, data) {
  ns <- session$ns
  # numeric inputs
  form <- reactive({
    n <- nrow(data())
    inputs <- character(n)
    for (i in seq_len(n)) {
      inputs[i] <- as.character(numericInput(
        ns(paste0("Form",i)),value=0,label=NULL)
        )
    }
    session$sendCustomMessage('unbind-DT',ns("tbl"))
    data.frame(data(), RATE=inputs)
  })
  # datatable
  output$tbl <- DT::renderDataTable(form(),
                server=FALSE,escape=FALSE,selection='none',
                rownames=FALSE,options=list(
                  paging=FALSE,
                  bInfo=0,
                  bSort=0,
                  bfilter=0,
                    preDrawCallback=DT::JS(
                      'function() {Shiny.unbindAll(this.api().table().node());}'),
                   drawCallback=DT::JS(
                     'function(settings) {Shiny.bindAll(this.api().table().node());}')
                ))

  vals <- reactive({
    unlist(lapply(seq_len(nrow(data())),function(i) {
      value <- ifelse(is.null(input[[paste0("Form",i)]]),NA,input[[paste0("Form",i)]])
    }))
  })
  # generate webpage when button clicked
  observeEvent(input$btn, {
    HTML <- paste0("<p>",paste0(vals(),collapse=" </p> <p>"),"</p>")
    session$sendCustomMessage("display",HTML)
  })
}

ui <- fluidPage(
  mainPanel(
    selectInput("choose","Choose data",choices=c("mtcars","iris")),
    dtInputUI("example")
  )
)

server <- function(input, output, session) {
  dat <- reactive({
    req(input$choose)
    get(input$choose)
  })

  callModule(dtInput,"example",reactive(dat()))

}

shinyApp(ui, server)

在输入中输入任何内容,然后按按钮,即可创建包含输入的网页。更改数据集,在输入中输入不同的信息,然后再次按下按钮,您将获得与之前相同的信息,这告诉我旧输入未成功解除绑定。

知道我做错了吗?

由于

0 个答案:

没有答案