首页 > 解决方案 > 当我从 Shiny 的条件面板中取消选择主复选框输入时,如何自动取消选择复选框输入

问题描述

我正在创建一个应用程序,它有一个checkboxInput,如果你选择它,你会看到另外 2checkboxInput个。现在,如果您取消选择 maincheckboxInput尽管信息发生了变化,checkboxInput则 conditionalPanel 内的那些继续被选中。

图像1

图2

checkboxInput当我取消选择第一个主要选项时,如何自动取消选择这些选项?

我试图保存一个变量并将另一个变量更改checkboxInput为 FALSE,但是.. 它不起作用。我不知道我是否应该更新它们......或者是否有特定的方法可以做到这一点。

 data1 <- reactive({
    df <- data()
    selectPlay <- input$play
    if(selectPlay== 1){
      if(input$change_log2 == TRUE){
        df <- log2(df)
      }
      
      if(input$run_sqrt == TRUE){
        df <- sqrt(df)
      }
    }else{
      input$change_log2 == FALSE
      input$run_sqrt == FALSE
    }
    
    return(df)
  })

这是整个代码:

library(shiny)

# Define UI 
ui <- fluidPage(
  
  # Application title
  titlePanel("My app"),
  
  sidebarLayout(
    sidebarPanel(
      uiOutput("selected_sample_one"),
      uiOutput("selected_sample_two"),
      
      checkboxInput("play", strong("I want to play my data"), value = FALSE),
      
      conditionalPanel(
        condition = "input.play == 1",
        checkboxInput("change_log2", "Log2 transformation", value = FALSE),
        checkboxInput("run_sqrt", "sqrt option", value = FALSE))
    ),
    
    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("plot")
    )
  )
)

# Define server 
server <- function(input, output,session) {
  
  data <- reactive({
    numbers <- c(5,345,55,10)
    df<-data.frame(t(numbers))
    names(df) <- c("S1", "S2", "S3", "S4")
    
    return(df)
  })
  
  data1 <- reactive({
    df <- data()
    if(input$change_log2 == TRUE){
      df <- log2(df)
    }

    if(input$run_sqrt == TRUE){
      df <- sqrt(df)
    }

    return(df)
  })
  
  
  samples_names <- reactive({
    req(data())
    samples <- colnames(data())
    return(samples)
  })
  
  output$selected_sample_one <- renderUI({
    selectizeInput(inputId = "sample_one_axis", "Select the 1st sample", choices=samples_names(), options=list(maxOptions = length(samples_names())))
  })
  
  # With this function you can select which sample do you want to plot in the y-axis.
  output$selected_sample_two <- renderUI({
    selectizeInput(inputId = "sample_two_axis", "Select the 2nd sample", choices=samples_names(), selected=samples_names()[2], options=list(maxOptions = length(samples_names())))
  })
  
  output$plot <- renderPlot({
    req(input$sample_one_axis,input$sample_two_axis,data1())
    barplot(c(data1()[,input$sample_one_axis], data1()[,input$sample_two_axis]))
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

首先十分感谢

问候

标签: rshiny

解决方案


我对您的代码进行了一些更改,最重要的是使用observeEventupdateCheckboxInput. 除此之外,我把你data()变成了一个 normal data.frame,因为它不包含任何反应元素。

library(shiny)

# Define UI 
ui <- fluidPage(
  
  # Application title
  titlePanel("My app"),
  
  sidebarLayout(
    sidebarPanel(
      uiOutput("selected_sample_one"),
      uiOutput("selected_sample_two"),
      
      checkboxInput("play", strong("I want to play my data"), value = FALSE),
      
      conditionalPanel(
      condition = "input.play == 1",
      checkboxInput("change_log2", "Log2 transformation", value = FALSE),
      checkboxInput("run_sqrt", "sqrt option", value = FALSE)),
      ),
    
    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("plot")
    )
  )
)

# Define server 
server <- function(input, output,session) {
  
    numbers <- c(5,345,55,10)
    mydat <- data.frame(t(numbers))
    names(mydat) <- c("S1", "S2", "S3", "S4")
  
  data1 <- reactive({
    
    dat <- mydat
    
    if(input$change_log2){
      dat <- log2(dat)
    }
    
    if(input$run_sqrt){
      dat <- sqrt(dat)
    }
    
    dat
  })
  
  observeEvent(input$play, {
    
    if(!input$play) {
    updateCheckboxInput(session, "change_log2", value = FALSE)
    updateCheckboxInput(session, "run_sqrt", value = FALSE)
    }
    
  })
  
  
  samples_names <- reactive({
    samples <- colnames(mydat)
    return(samples)
  })
  
  output$selected_sample_one <- renderUI({
    selectizeInput(inputId = "sample_one_axis", "Select the 1st sample", choices=samples_names(), options=list(maxOptions = length(samples_names())))
  })
  
  # With this function you can select which sample do you want to plot in the y-axis.
  output$selected_sample_two <- renderUI({
    selectizeInput(inputId = "sample_two_axis", "Select the 2nd sample", choices=samples_names(), selected=samples_names()[2], options=list(maxOptions = length(samples_names())))
  })
  
  output$plot <- renderPlot({
    req(input$sample_one_axis,input$sample_two_axis,data1())
    barplot(c(data1()[,input$sample_one_axis], data1()[,input$sample_two_axis]))
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

推荐阅读