简体   繁体   中英

R Shiny: Switch between table and plot in renderUI

I am trying to let the user select the kind of display he wishes, but when I try to render the plot it gives me an error.

Here is the code:

library(shiny)
library(DT)
library(data.table)

runApp(list(
    ui = fluidPage(
        wellPanel(
            radioButtons("visuBtn", NULL, choices = c(Table = "table", Plot = "plot"))
        ),
        wellPanel(
            uiOutput("DataTable")
        )
    ),
    server = function(input, output){

        observeEvent(input$visuBtn,{
            output$DataTable <- renderUI({
                dfconc <- data.table(time = c(1,2,3,4,5), concentration = c(0.1, 0.4, 0.5, 0.7, 0.8))

                if(input$visuBtn == "table"){
                    output$aa <- renderDataTable(dfconc, options = list(paging = FALSE, searching = FALSE))
                    dataTableOutput("aa")
                }
                else { ### NOT WORKING
                    output$aa <- renderPlot({
                        plot(dfconc$time, dfconc$concentration, xlab = "Time", ylab = "Concentration")
                    })
                    fixedRow(
                        plotOutput("aa")
                    )
                }      ###

            })
        })
    }
))


Thanks for your help

I think its better if you render the outputs on the client side and then simply show and hide the elements based on the selection. This way you're not wasting resources on the server side

library(shiny)
library(shinyjs)
library(DT)
library(data.table)

runApp(list(
  ui = fluidPage(
    useShinyjs(),
    wellPanel(
      radioButtons("visuBtn", NULL, choices = c(Table = "table", Plot = "plot"))
    ),
    wellPanel(
      dataTableOutput("mytable"),
      plotOutput("myplot")
    )
  ),
  server = function(input, output, session){

    dfconc <- data.table(time = c(1,2,3,4,5), concentration = c(0.1, 0.4, 0.5, 0.7, 0.8))

    output$mytable <- renderDataTable(
      dfconc, options = list(paging = FALSE, searching = FALSE)
    )

    output$myplot <- renderPlot({
      plot(dfconc$time, dfconc$concentration, xlab = "Time", ylab = "Concentration")
    })

    observeEvent(input$visuBtn,{
      req(input$visuBtn)
      if(input$visuBtn == "plot"){
        hide("mytable")
        show("myplot")
      }else{
        hide("myplot")
        show("mytable")
      }
    })
  }
))

Agree with @Pork Chop. But why not simply use a conditionalPanel

library(shiny)
library(DT)
library(data.table)

runApp(list(
  ui = fluidPage(
    wellPanel(
      radioButtons("visuBtn", NULL, choices = c(Table = "table", Plot = "plot"))
    ),

      conditionalPanel(
        condition = "input.visuBtn == 'table'",
        DTOutput('aa')
      ),
      conditionalPanel(
        condition = "input.visuBtn == 'plot'",
        plotOutput('bb')
      )

  ),
  server = function(input, output){
    dfconc <- data.table(time = c(1,2,3,4,5), concentration = c(0.1, 0.4, 0.5, 0.7, 0.8))

          output$aa <- renderDT(dfconc, options = list(paging = FALSE, searching = FALSE))
          output$bb <- renderPlot({
            plot(dfconc$time, dfconc$concentration, xlab = "Time", ylab = "Concentration")
          })
        } 

))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM