在闪亮的应用程序中使用 2 个 actionButton 在 3 个图之间切换

时间:2021-04-19 22:20:03

标签: r shiny

我有 shiny 应用程序,下面的初始值应显示 iris 数据集的图。如果按下 Datatable 那么它应该显示 iris 数据集的数据表,如果再次按下它应该再次显示 iris 数据集的初始图。 如果按下 Iris3 那么它应该显示 iris3 数据集的图,如果再次按下它应该再次显示 iris 数据集的初始图。

library(shiny)
library(DT)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      
      
      actionButton("exc",
                   "Datatable"),
      actionButton("other","Iris3")
    ),
    mainPanel(
      uiOutput(outputId = "iris_plot")
      
    )
  )
)
server <- function(input, output) {
  
  showPlot <- reactiveVal(TRUE)
  showPlotiris3 <- reactiveVal(TRUE)
  
  observeEvent(input$exc, {
    showPlot(!showPlot())
  })
  observeEvent(input$other, {
    showPlotiris3(!showPlotiris3())
  })
  output$iris_plot <- renderUI({
    if (showPlot()){
      plotOutput("plot")
    }
    else if(showPlotiris3()){
      plotOutput("plot2")
    }
    else{
      dataTableOutput("table")
    }
  })
  
  output[["plot"]] <- renderPlot({
    plot(iris)
  })
  output[["plot2"]] <- renderPlot({
    plot(iris3)
  })
  output[["table"]] <- renderDataTable(datatable(iris))
  
}
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

试试这个

library(shiny)
library(DT)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      actionButton("exc","Datatable"),
      actionButton("other","Iris3")
    ),
    mainPanel( verbatimTextOutput("t1"),
      uiOutput(outputId = "iris_plot")
    )
  )
)
server <- function(input, output) {
  
  store <- reactiveValues()
  observe({store$plotrtable <- DTOutput("table")})
  
  observeEvent(input$exc, {
    if (as.numeric(input$exc) %% 2 == 1){store$plotrtable <- plotOutput("plot")
    }else store$plotrtable <- DTOutput("table")
  })
  observeEvent(input$other, {
    if (as.numeric(input$other) %% 2 == 1){store$plotrtable <- plotOutput("plot2")
    }else store$plotrtable <- DTOutput("table")
  })
  
  output[["plot"]] <- renderPlot({
    plot(iris)
  })
  output[["plot2"]] <- renderPlot({
    plot(iris3)
  })
  output[["table"]] <- renderDT(datatable(iris))

  output$iris_plot <- renderUI({
    store$plotrtable
  })
  
}
shinyApp(ui = ui, server = server)