如何在Shiny中隐藏条件面板?

时间:2017-10-13 17:28:18

标签: r shiny shinyjs

如何在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)

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

2 个答案:

答案 0 :(得分:4)

您可以创建输出值并仅将其用于条件面板。关于动态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更改之前显示。

答案 1 :(得分:1)

我从未玩过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")
      })
    }
  )
}

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