模块化 R Shiny 应用程序中带有 renderUI returns NULL 的 sliderInput

sliderInput with renderUI returns NULL in modularized R Shiny app

我有一个模块化的 R Shiny 应用程序,其中在 renderUI() 中创建了一个 sliderInput(),以便可以将值传递给进一步处理(此处为 renderPrint())。首先,我在一个由 global.Rui.Rserver.R 组成的简单应用程序中测试了该构造,它按预期工作(即在滑块修改时,打印了正确的滑块输入):

global.R

library(shiny)

ui.R

shinyUI(fluidPage(
  fluidRow(column(3, 
                  uiOutput("ui")),
           column(3,
                  verbatimTextOutput("dynamic_value")))))

server.R

shinyServer(function(input, output, session) {
  
  output$ui <- renderUI({
    sliderInput("dynamic", "The slider:",
                min = 1, 
                max = 20,
                value = 10)
  })
  
  output$dynamic_value <- renderPrint({
    str(input$dynamic)
  })
  
})

然后,我将此构造转移到模块化应用程序中,令我惊讶的是,从滑块传递到文本输出的值是 NULL 而不是滑块输入的实际值:

global.R

library(shiny)

# load module
source("test_module.R")

test_ui.R

test_module_ui(id = "test")

ui.R

shinyUI(fluidPage(navbarPage(title = "Dynamic sliderInput",
                             tabPanel("Panel",
                                      source("test_ui.R",
                                             local = TRUE)$value))))

server.R

shinyServer(function(input, output, session) {
  callModule(test_module, "test")
  })

test_module.R

test_module_ui <- function(id) {
  ns <- NS(id) # namespace
  
  fluidRow(
    column(3, 
           uiOutput(ns("ui"))),
    column(3,
           verbatimTextOutput(ns("dynamic_value")))
    )
}

test_module <- function(input, output, session) {
  output$ui <- renderUI({
    sliderInput("dynamic", "The slider:",
                min = 1, 
                max = 20,
                value = 10)
  })
  
  output$dynamic_value <- renderPrint({
    str(input$dynamic)
  })
}

有人知道这里指定的错误吗?非常感谢任何提示——谢谢! :)

this question 所述,您必须在 renderUI():

中使用 session$ns()
test_module_server <- function(input, output, session) {
  output$ui <- renderUI({
    sliderInput(session$ns("dynamic"), "The slider:",
                min = 1, 
                max = 20,
                value = 10)
  })