R Shiny:在 table 之间切换并在 renderUI 中绘制

R Shiny: Switch between table and plot in renderUI

我试图让用户 select 他想要的那种显示,但是当我尝试渲染绘图时它给了我一个错误。

代码如下:

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")
                    )
                }      ###

            })
        })
    }
))


感谢您的帮助

我认为最好在客户端呈现输出,然后根据选择简单地 showhide 元素。这样您就不会在 server

浪费资源
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")
      }
    })
  }
))

同意@Pork Chop。但为什么不简单地使用 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")
          })
        } 

))