是否可以在 Shiny 中将 eventReactive 用于超过 1 个 checkboxInput?

Posted

技术标签:

【中文标题】是否可以在 Shiny 中将 eventReactive 用于超过 1 个 checkboxInput?【英文标题】:Is it possible to use eventReactive for more than 1 checkboxInput in Shiny? 【发布时间】:2021-10-11 06:10:07 【问题描述】:

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

上一篇文章的代码和这篇文章的不同之处在于,我添加了一个条件面板和两个复选框输入,而不是 1。

由于这里的条件是如果用户选择条件(播放),我认为解决方案是写eventReactive(input$play,)。但是,checkboxInputs 都不起作用。

另一方面,如果您编写 eventReactive(input$change_log2,),其中一个 checkboxInputs(对数)有效。但是如果你选择另一个(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)

非常感谢,

问候

【问题讨论】:

只需将data1 &lt;- eventReactive 替换为data1 &lt;- reactive 就可以了。 @Limey 是的!我没有尝试这样做,因为我遇到了反应性问题,有人在我的另一篇帖子中用eventReactive 解决了这个问题。但是,现在有 2 个选项,实际上我没有问题(至少现在)。非常感谢! 【参考方案1】:

您可以简单地将相关输入包装在 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)

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

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

【讨论】:

此解决方案有效,但当您没有像我的那样复杂的输出时。不过,非常感谢您的帮助:)【参考方案2】:

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

非常感谢。

【讨论】:

以上是关于是否可以在 Shiny 中将 eventReactive 用于超过 1 个 checkboxInput?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Shiny eventReactive 处理程序中侦听多个事件表达式

通过编辑表格和/或 eventReactive 来更新handsontable

闪亮的 SelectInput 和 SelectizeInput

如何在 Shiny 的 ConditionalPanel 中将列表添加到隐藏的选项中?

如何使用 insertUI 在 Shiny 应用程序中将 textInput 转换为输出

在 Shiny 中将 Tooltip 添加到 navbarMenu