当我尝试显示多个图时,使用actionButton的奇怪行为

时间:2018-02-12 17:39:56

标签: r shiny

我观察到actionButton的一些奇怪行为,特别是当它与绘图有关时。以下是我的例子:

基本上,在我的应用程序中,我有一个actionButton和2个报告部分,每个部分包含一个独立的图。在初始化时,我将有2个不同的线性图。但是,当用户点击actionButton时,会生成2个不同的图,并生成随机值。

但奇怪的是,我看到,当用户点击actionButton时,屏幕上只显示一个图表。但是,在初始化时,两个图都会显示出来。

任何解释导致这种奇怪行为的原因是什么?

我的ShinyApp:

library(shiny)

ui = shinyUI(pageWithSidebar(
  headerPanel("actionButton test"),
  sidebarPanel(
   fluidRow(column(6, offset = 3, actionButton("Run", label = "Run")))
  ),
  mainPanel(
    fluidRow(column(12, style = "background-color:White;", plotOutput("Chart1", height = '475px'))),
    fluidRow(column(12, style = "background-color:White;", plotOutput("Chart2", height = '475px')))
  )
))

server = function(input, output) {
      Values = reactiveValues(default = 0)
                        observeEvent(input$Run, {
                                Values$default = input$Run
                            })

        Plot = eventReactive(input$Run, {                                                       
                        Plot1 = plot(rnorm(100))
                        Plot2 = plot(rnorm(100))

                        return(list('Plot1' = Plot1, 'PLot2' = Plot2))
                    })

        output$Chart1 = renderPlot({
                if (Values$default == 0) {
                        plot(1:100)
                    } else {
                        Plot()$Plot1
                    }
            })
        output$Chart2 = renderPlot({
                if (Values$default == 0) {
                        plot(200:100)
                    } else {
                        Plot()$Plot2
                    }
            })
    }

 runApp(shinyApp(ui = ui, server = server))

1 个答案:

答案 0 :(得分:0)

为什么不简单地使用:

server = function(input, output) {


  output$Chart1 = renderPlot({
    if (input$Run == 0) {
      plot(1:100)
    } else {
      plot(rnorm(100))
    }
  })
  output$Chart2 = renderPlot({
    if (input$Run == 0) {
      plot(200:100)
    } else {
      plot(rnorm(100))
    }
  })
}

runApp(shinyApp(ui = ui, server = server))

我不确定为什么(虽然它似乎与plot相关)但它不起作用,但您的代码适用于ggplot2:

server = function(input, output) {
  Values = reactiveValues(default = 0)
  observeEvent(input$Run, {
    Values$default = input$Run
  })

  Plot = eventReactive(input$Run, {         

    df <- data.frame(x = 1:100, y = rnorm(100))
    df2 <- data.frame(x = 1:100, y = rnorm(100))
    Plot1 = ggplot(data =df, aes(x= x, y=y)) + geom_point() + theme_bw()
    Plot2 = ggplot(data =df2, aes(x= x, y=y)) + geom_point() + theme_bw()

    return(list('Plot1' = Plot1, 'Plot2' = Plot2))
  })

  output$Chart1 = renderPlot({
    if (Values$default == 0) {
      plot(1:100)
    } else {
      print(Plot()$Plot1)
    }
  })
  output$Chart2 = renderPlot({
    if (Values$default == 0) {
      plot(200:100)
    } else {
      print(Plot()$Plot2)
    }
  })
}

runApp(shinyApp(ui = ui, server = server))