gpt4 book ai didi

r - Shiny:在模块或嵌套模块中使用 uiOutput?

转载 作者:行者123 更新时间:2023-12-03 20:19:15 26 4
gpt4 key购买 nike

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

下面的代码显示了我对 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)

最佳答案

Joe Cheng 在 Shiny 的讨论邮件列表中提供了答案。

1) In output$inner_slider's renderUI, change sliderInput("slider2", ...) to sliderInput(session$ns("slider2"), ...). This is how you get ahold of the namespace of the current module instance (innerMod).

2) I'd also add this to the first line of output$inner_plot: req(input$slider2)

This indicates that the render of that plot should not continue unless a value for input$slider2 exists (which it won't as the app starts up).



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

关于r - Shiny:在模块或嵌套模块中使用 uiOutput?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38513912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com