编辑后的数据表未在闪亮模块中更新

问题描述 投票:0回答:1

我想将 numericInput 和 checkBoxInput 嵌入数据表中。我有一个来自谢一辉的例子,效果非常好。正是我想要的。 但是,当代码包装在模块中时,编辑的表不会更新。我读到这可能是由于命名空间造成的,但我不知道如何修复它。

以下是要点:

要点:在 Shiny App 中编辑数据表

要点:在闪亮模块中编辑数据表

r shiny dt shinymodules
1个回答
1
投票

只有一个小修复,如果您不熟悉 Shiny 模块,当然很难看出这一点。您在模块服务器函数中创建的每个 Input 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")
  }
)
© www.soinside.com 2019 - 2024. All rights reserved.