在我的应用程序中,我将一个模块嵌套在另一个模块中。父模块和子模块都使用 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)
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
| 归档时间: |
|
| 查看次数: |
2457 次 |
| 最近记录: |