编辑的DataTable未在Shiny Module中更新

时间:2018-05-24 16:03:32

标签: datatable module shiny

我想在数据表中嵌入numericInput和checkBoxInput。我有一个谢毅辉的例子,效果很好。完全像我想要的。 但是当代码包装在模块中时,编辑的表不会更新。我读到这可能是由于命名空间,但我不知道如何解决它。

以下是要点:

Gist: edit DataTable in Shiny App

Gist: edit DataTable in Shiny Module

提前致谢:)

1 个答案:

答案 0 :(得分:0)

只有一个小修复,当然很难看出你是否不熟悉Shiny模块。您在Module Server函数中创建的每个输入ID 都必须包含在ns中(就像在UI中一样),但此功能隐藏在服务器的session$ns中功能。因此,在创建输入的第18行中,必须使用session$ns调整其ID。从

inputs[i] = as.character(FUN(paste0(id, i), label = NULL, ...))

inputs[i] = as.character(FUN(paste0(session$ns(id), i), label = NULL, ...))

完整代码:

library(shiny)
library(DT)


editTableUI <- function(id) {
  ns <- NS(id)
  tagList(
    DT::dataTableOutput(ns('x1')),
    verbatimTextOutput(ns('x2'))
  )
}

editTable <- function(input, output, session) {
  # create a character vector of shiny inputs
  shinyInput = function(FUN, len, id, ...) {
    inputs = character(len)
    for (i in seq_len(len)) {
      inputs[i] = as.character(FUN(paste0(session$ns(id), i), label = NULL, ...))
    }
    inputs
  }



  # obtain the values of inputs
  shinyValue = function(id, len) {
    unlist(lapply(seq_len(len), function(i) {
      value = input[[paste0(id, i)]]
      if (is.null(value)) NA else value
    }))
  }

  # a sample data frame
  res = data.frame(
    v1 = shinyInput(numericInput, 100, 'v1_', value = 0),
    v2 = shinyInput(checkboxInput, 100, 'v2_', value = TRUE),
    v3 = rnorm(100),
    v4 = sample(LETTERS, 100, TRUE),
    stringsAsFactors = FALSE
  )

  # render the table containing shiny inputs
  output$x1 = DT::renderDataTable(
    res, server = FALSE, escape = FALSE, options = list(
      preDrawCallback = JS('function() {
                           Shiny.unbindAll(this.api().table().node()); }'),
      drawCallback = JS('function() {
                        Shiny.bindAll(this.api().table().node()); } ')
      )
      )
  # print the values of inputs
  output$x2 = renderPrint({
    data.frame(v1 = shinyValue('v1_', 100), v2 = shinyValue('v2_', 100))
  })
      }

shinyApp(
  ui = fluidPage(
    editTableUI("test")
  ),

  server = function(input, output) {
    callModule(editTable, "test")
  }
)
相关问题