使用闪亮模块时,无法在动态UI中渲染绘图

时间:2016-08-08 02:07:57

标签: r module shiny

通常情况下,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)

我很感激任何有关如何使第一个代码块表现得像第二个代码的指针。

1 个答案:

答案 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)

两件事:

  1. 在定义之前你引用了exampleUI(在你的实际例子中,你可能source模块,所以这应该不是问题)

  2. 在包含输入/输出的模块中使用renderUI时,需要将其包含在ns中。阅读Using renderUI within modules部分了解更多