闪亮:在模块或嵌套模块中使用 uiOutput?

tba*_*s45 5 r shiny

在我的应用程序中,我将一个模块嵌套在另一个模块中。父模块和子模块都使用 renderUI(滑块)创建 UI 输出,并根据此滑块的值过滤显示在 ggplot 上的数据。我熟悉常规用户界面/服务器情况下的这种模式 - 但是,我不确定如何在模块中访问滑块的值。

下面的代码显示了我对 UI 调用的模块和嵌套模块执行此操作的尝试

library(shiny)
library(dplyr)
library(ggplot2)


ui <- fluidPage(
  fluidRow(
    outerModUI("outer")
  )
)

outerModUI <- function(id) {
  ns <- NS(id)
  fluidPage(fluidRow(
    uiOutput(ns("outer_slider")),
    plotOutput(ns("outer_plot")),
    innerModUI(ns("inner"))
  ))
}

innerModUI <- function(id) {
  ns <- NS(id)

  fluidPage(fluidRow(
    uiOutput(ns("inner_slider")),
    plotOutput(ns("inner_plot"))
  ))
}


server <- function(input, output, session) {
  callModule(outerMod, "outer")

  output$outer_slider <- renderUI({
    sliderInput("slider1", label = "outer slider", min = round(min(mtcars$mpg)), 
      max = round(max(mtcars$mpg)), value = c(min(mtcars$mpg), max(mtcars$mpg), step = 1))
  })

  output$outer_plot <- renderPlot({
    data <- filter(mtcars, between(mpg, input$slider1[1], input$slider1[2]))
    ggplot(data, aes(mpg, wt)) + geom_point()
  })
}

outerMod <- function(input, output, session) {
  callModule(innerMod, "inner")
}

innerMod <- function(input, output, session) {
  output$inner_slider <- renderUI({
    sliderInput("slider2", label = "inner slider", min = round(min(mtcars$mpg)), 
      max = round(max(mtcars$mpg)), value = c(min(mtcars$mpg), max(mtcars$mpg), step = 1))
  })

  output$inner_plot <- renderPlot({
    data <- filter(mtcars, between(mpg, input$slider2[1], input$slider2[2]))
    ggplot(data, aes(mpg, wt)) + geom_point()
  })
}


shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

tba*_*s45 6

Joe Cheng 在闪亮的讨论邮件列表上提供了答案。

1) 在output$inner_slider 的renderUI 中,将sliderInput("slider2", ...) 更改为sliderInput(session$ns("slider2"), ...)。这就是你如何获得当前模块实例(innerMod)的命名空间。

2)我也会把它添加到 output$inner_plot 的第一行:req(input$slider2)

这表明该图的渲染不应继续,除非 input$slider2 的值存在(当应用程序启动时它不会存在)。

工作要点在这里,renderUI 在父模块和子模块中都能正常工作。https://gist.github.com/tbadams45/38f1f56e0f2d7ced3507ef11b0a2fdce