是否可以在 Shiny 中对 1 个以上的 checkboxInput 使用 eventReactive?

Is it possible to use eventReactive for more than 1 checkboxInput in Shiny?

几天前我在这个中得到了回答。解决方案在那一刻是完美的,但我意识到我忘了问我如何用超过 1 checkboxInput 来做到这一点。因为...我已经尝试了很多东西,但该解决方案不适合我使用 2 个 checkboxInput。也许可以用相同的解决方案改变一些东西来完成,但是,因为我是新手,所以我找不到办法做到这一点。

上一个 post 和这个代码的区别在于我添加了一个 conditionalPanel 和两个 checkboxInputs 而不是 1.

由于这里的条件是如果用户select是条件(播放),我认为解决方案是写eventReactive(input$play,{})。但是,none 的 checkboxInputs 有效。

另一方面,如果您写 eventReactive(input$change_log2,{}) 一个复选框输入(对数)有效。但是如果你 select 另一个 (srqt) 它什么也不会做。

我看到另一种方法可以使用 observeobserveEvent 但我无法将结果保存在变量中,所以...我需要 eventReactive...

有点迷茫

有人可以帮助我吗?最终我会添加更多的 checkboxInputs...所以我需要一种可以使用 2 个以上的 checkboxInputs 的方法。

这是代码:

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 <- eventReactive(input$play,{
    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)

非常感谢,

此致

您可以简单地将相关输入包装在 c() 中。

这是一个 MWE:

library(shiny)

ui <- fluidPage(
  checkboxInput("check1", "Checkbox 1"),
  checkboxInput("check2", "Checkbox 2"),
  textOutput("text")
)

server <- function(input, output, session) {
  v <- reactiveValues(text="Waiting...")
  
  observeEvent(c(input$check1, input$check2), {
    s <- "Checked: "
    if (input$check1) {
      s <- paste(s, "1")
    }
    if (input$check2) {
      s <- paste(s, "2")
    }
    v$text <- s
  },
  ignoreInit=TRUE
  )
  
  output$text <- renderText({
    v$text
  })
}

shinyApp(ui, server)

或者,您可以将需要做的事情包装在一个函数中,然后在一系列 observeEvent 中调用该函数,每个相关输入一个。

[我在你更新 post 之前就开始写作了。]

感谢@Limey,我的问题的解决方案是将 data1 <- eventReactive 替换为 data1 <- reactive

非常感谢。