繁体   English   中英

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

[英]How to hide a conditional panel in Shiny?

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

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

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

我从来没有玩过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相应的面板。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM