通常情况下,Shiny在用户无意中调用的UI中生成绘图没有问题,但我注意到当使用闪亮模块动态生成UI时,绘图不会出现。
以下是模块化闪亮应用程序的最小示例,可以重现问题;当用户按下“go”按钮时,它应该生成一个带有绘图的ui:
library("shiny")
exampleUI <- function(id, label = "example") {
ns <- NS(id)
tagList( actionButton(ns("go"), "Go"), uiOutput(ns("ui")) )
}
ui <- fluidPage( exampleUI("example") )
example <- function(input, output, session) {
observeEvent(input$go, {
output$plot <- renderPlot( plot(1:5, 1:5) )
output$ui <- renderUI( plotOutput("plot") )
})
}
server <- function(input, output) { callModule(example, "example") }
shinyApp(ui, server)
相比之下,非模块化版本按预期工作:
ui <- fluidPage(
tagList( actionButton("go", "Go"), uiOutput("ui") )
)
server <- function(input, output) {
observeEvent(input$go, {
output$plot <- renderPlot( plot(1:5, 1:5) )
output$ui <- renderUI( plotOutput("plot") )
})
}
shinyApp(ui, server)
我很感激任何有关如何使第一个代码块表现得像第二个代码的指针。
答案 0 :(得分:1)
library(shiny)
exampleUI <- function(id, label = "example") {
ns <- NS(id)
tagList( actionButton(ns("go"), "Go"), uiOutput(ns("ui")) )
}
example <- function(input, output, session) {
observeEvent(input$go, {
output$plot <- renderPlot( plot(1:5, 1:5) )
ns <- session$ns
output$ui <- renderUI( plotOutput(ns("plot")) )
})
}
ui <- fluidPage( exampleUI("example") )
server <- function(input, output, session) {
callModule(example, "example")
}
shinyApp(ui, server)
两件事:
在定义之前你引用了exampleUI
(在你的实际例子中,你可能source
模块,所以这应该不是问题)
在包含输入/输出的模块中使用renderUI
时,需要将其包含在ns
中。阅读Using renderUI within modules部分了解更多