【问题标题】:How to hide a conditional panel in Shiny?如何在 Shiny 中隐藏条件面板?
【发布时间】:2018-03-25 21:33:16
【问题描述】:

如何在 Shiny 中隐藏条件面板?请看下面的例子:

library(shiny)

ui <- fluidPage(
  actionButton("eval","Evaluate"),
  numericInput("num_input", "If number is changed, cp must hide", value = 0),
  conditionalPanel(
      condition = "input.eval",
      "text"))

server <- function(input, output, session) {
  observeEvent(input$num_input, {
    input$eval <- 0
  })}

shinyApp(ui, server)

我想要实现的是:一旦用户单击评估按钮,条件面板就会出现,但是一旦num_input 中的数字改变,面板就会消失。我的想法是取消评估按钮,但这不起作用(应用程序以灰色背景打开并且似乎被冻结)。

我也像这样用shinyjs 尝试过:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  actionButton("eval","Evaluate"),
  numericInput("num_input", "If number is changed, cp must hide", value = 0),
  conditionalPanel(
      id = "cond_panel",
      condition = "input.eval",
      "text"))

server <- function(input, output, session) {
  observeEvent(input$num_input, {
    reset("cond_panel")})}

shinyApp(ui, server)

但这也不起作用:应用程序会定期打开,单击评估按钮后会显示条件面板,但更改数字后不会发生任何事情。

【问题讨论】:

    标签: r shiny shinyjs


    【解决方案1】:

    您可以创建一个输出值并将其仅用于条件面板。关于动态 UI 的文章解释了如何做到这一点:

    http://shiny.rstudio.com/articles/dynamic-ui.html

    条件也可以使用输出值;它们以相同的方式工作(output.foo 为您提供输出 foo 的值)。如果您希望可以使用 R 表达式作为条件参数,则可以在服务器函数中创建反应式表达式并将其分配给新输出,然后在条件表达式中引用该输出。

    如果您这样做,请确保同时设置 outputOptions(output, [newOutputName],suspendWhenHidden = FALSE)。 (这是必要的,因为 Shiny 通常不会将值发送到浏览器以获取隐藏或不存在于 UI 中的输出。但是,在这种情况下,浏览器确实需要知道最新的输出值才能按顺序正确评估 contitionalPanel 函数的条件 - suspendWhenHidden = FALSE 确保这会发生。)

    library(shiny)
    
    ui <- fluidPage(
      actionButton("eval","Evaluate"),
      numericInput("num_input", "If number is changed, cp must hide", value = 0),
      conditionalPanel("input.eval && !output.hide_panel", "text")
    )
    
    server <- function(input, output, session) {
    
      output$hide_panel <- eventReactive(input$num_input, TRUE, ignoreInit = TRUE)
    
      outputOptions(output, "hide_panel", suspendWhenHidden = FALSE)
    }
    
    shinyApp(ui, server)
    

    另一种方法是renderUI 条件面板,并显示它直到input$num_input 发生变化。

    【讨论】:

      【解决方案2】:

      我从来没有玩过conditionalPanel,所以不确定它是否有隐藏/显示的默认设置。以下可能会为您提供所需的输出。

      library(shiny)
      library(shinyjs)
      
      if(interactive()){
        shinyApp(
          ui <- fluidPage(
            shinyjs::useShinyjs(),
            actionButton("eval","Evaluate"),
            numericInput("num_input", "If number is changed, cp must hide", value = 0),
            shinyjs::hidden(
              div(
                id = "cp1",
                conditionalPanel(condition = "input.eval", 
                                 textOutput("text1")))
              )
            ),
      
          server = function(input, output, session){
            output$text1 <- renderText({
              input$num_input
            })
            observeEvent(input$eval,{
              shinyjs::show("cp1")
            })
            observeEvent(input$num_input,{
              shinyjs::hide("cp1")
            })
          }
        )
      }
      

      我最初使用shinyjs 隐藏conditionalPanel,显示使用renderText 输入的数字输入,并相应地有两个observeEventhide\show 面板。

      【讨论】:

        猜你喜欢
        • 2018-05-12
        • 1970-01-01
        • 2021-07-10
        • 2016-08-14
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 2017-10-18
        相关资源
        最近更新 更多