单击 R shiny 中的不同按钮时,在同一框中显示 table 或图表

Display table or chart in the same box upon clicking different buttons in R shiny

我正在尝试创建一个带有 2 个按钮的应用程序,以在同一框内容中显示图表或 table(不是两者)。 例如,如果用户点击图表按钮,图表就会出现。同样点击 table 按钮,table 出现在同一个地方,图表消失。

最小示例

if (interactive()) {
  library(shiny)
  library(shinydashboard)
  shinyApp(
    ui = shinydashboard::dashboardPage(
      header = dashboardHeader(),
      sidebar = dashboardSidebar(),
      body = dashboardBody(
        actionButton(inputId = 'input1', label = 'Chart'),
        actionButton(inputId = 'input2', label = 'Table'),
        box(
          uiOutput('plot_table_output'))
      ),
      title = "DashboardPage"
    ),
    server = function(input, output) {
      output$plot_table_output <- renderUI({
        if(input$input1 >0) {
          plotOutput('my_plot')
        }
        if(input$input2 >0) {
          dataTableOutput('mytable')
        } 
      })
      
      output$my_plot <- renderPlot({
        mydf <- data.frame(X=1:10, Y=1:10)
        plot(mydf$X, mydf$Y, type = 'l')
      })
      
      output$mytable <- renderDataTable({
        mydf <-  data.frame(X=1:10, Y=1:10)
        mydf
      })   
    }
  )
}

一种方法是使用 ObserveEvent()。试试这个

library(shiny)
library(shinydashboard)
shinyApp(
  ui = shinydashboard::dashboardPage(
    header = dashboardHeader(),
    sidebar = dashboardSidebar(),
    body = dashboardBody(
      actionButton(inputId = 'input1', label = 'Chart'),
      actionButton(inputId = 'input2', label = 'Table'),
      box(
        uiOutput('plot_table_output'))
    ),
    title = "DashboardPage"
  ),
  server = function(input, output) {
    
    observeEvent(input$input1, {
      output$plot_table_output <- renderUI({
          plotOutput('my_plot')
      })
    })
    
    observeEvent(input$input2, {
      output$plot_table_output <- renderUI({
        dataTableOutput('mytable')
      })
    })
    
    output$my_plot <- renderPlot({
      mydf <- data.frame(X=1:10, Y=1:10)
      plot(mydf$X, mydf$Y, type = 'l')
    })
    
    output$mytable <- renderDataTable({
      mydf <-  data.frame(X=1:10, Y=1:10)
      mydf
    })   
  }
)