簡體   English   中英

在Shiny中使用Conditionalpanel函數

[英]Using Conditionalpanel Function in Shiny

我正在嘗試創建一個使用條件面板的場景,我可以讓用戶輸入復選框以一個接一個地顯示1個或2個圖。

我的可復制代碼可以在下面找到,但是,我無法顯示圖表。

有人可以跟我分享我在哪里出錯了?

library(shiny)

ui = fluidPage(
  titlePanel("Plot1 or Plot2?"),
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("my_choices", "Plot1 or Plot2",choices = c("Plot1", "Plot2"), selected = "Plot1"),width=2),
    mainPanel(
      conditionalPanel(
        condition = "input.my_choices == 'Plot1'",
        plotOutput("plot1")
      ),
      conditionalPanel(
        condition = "input.my_choices == 'Plot2'",
        plotOutput("plot2")
      ), 
      conditionalPanel(
        condition = "input.my_choices.includes('Plot1', 'Plot2')",
        plotOutput("plot1"),
        plotOutput("plot2")
      )
    )
  )
)

server = function(input, output) {

  output$plot1 <- renderPlot({plot(iris)})
  output$plot2 <- renderPlot({plot(mtcars)})
}

shinyApp(ui, server)

更新:

我已經有了想要的東西,但是沒有使用ConditionalPanel函數。 這是下面的代碼:

如果有人可以與我分享使用ConditionalPanel函數的正確方法,將不勝感激! (:

library(shiny)

#data
df <- iris

#ui
ui <- fluidPage(
    sidebarPanel(
      checkboxGroupInput(inputId = "Question",
                         label = "Choose the plots",
                         choices = c("Plot1", "Plot2", "Plot3"),
                         selected = "")),
    mainPanel(
      uiOutput('ui_plot') 
    )
  )

#server
server <- function(input, output)
{
  # gen plot containers
  output$ui_plot <- renderUI({ 
    out <- list()
    if (length(input$Question)==0){return(NULL)}
    for (i in 1:length(input$Question)){
      out[[i]] <-  plotOutput(outputId = paste0("plot",i))
    }  
    return(out) 
  })

  # render plots
  observe({  
    for (i in 1:3){  
      local({  #because expressions are evaluated at app init
        ii <- i 
        output[[paste0('plot',ii)]] <- renderPlot({ 
          if ( length(input$Question) > ii-1 ){  
            return(plot(runif(100)))
          } 
          NULL
        })
      })
    }                                  

  })

}

shinyApp(ui, server)

我會給你一個替代方案,因為您將需要創建具有不同id新圖以使其起作用。 我能想到的最簡單的方法是使用shinyjs包及其hideshow功能。 您也可以通過renderUI進行此renderUI但是只有在顯示和隱藏元素時,才應該對服務器進行不必要的工作

library(shiny)
library(shinyjs)

ui = fluidPage(
  useShinyjs(),
  titlePanel("Plot1 or Plot2?"),
  sidebarLayout(
    sidebarPanel(
      checkboxGroupInput("my_choices", "Plot1 or Plot2",choices = c("Plot1", "Plot2"), selected = "Plot1"),width=2),
    mainPanel(
      plotOutput("plot1"),
      plotOutput("plot2")
    )
  )
)

server = function(input, output,session) {

  # hide plots on start
  hide("plot1");hide("plot2")

  output$plot1 <- renderPlot({plot(iris)})
  output$plot2 <- renderPlot({plot(mtcars)})

  observeEvent(input$my_choices,{

    if(is.null(input$my_choices)){
      hide("plot1"); hide("plot2")
    }

    else if(length(input$my_choices) == 1){
      if(input$my_choices == "Plot1"){
        show("plot1");hide("plot2")
      }
      if(input$my_choices == "Plot2"){
        hide("plot1");show("plot2")
      }
    }

    else{

      if(all(c("Plot1","Plot2") %in% input$my_choices)){
        show("plot1");show("plot2")
      }
    }
  },ignoreNULL = F)
}

shinyApp(ui, server)

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM