如何在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)
Run Code Online (Sandbox Code Playgroud)
我要实现的目标是:一旦用户单击评估按钮,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)
Run Code Online (Sandbox Code Playgroud)
但这也不起作用:应用程序会定期打开,并且一旦单击评估按钮,便会显示条件面板,但是一旦更改了数字,则什么也不会发生。
您可以创建一个输出值,并将其仅用于条件面板。有关动态UI的文章介绍了如何执行此操作:
http://shiny.rstudio.com/articles/dynamic-ui.html
该条件也可以使用输出值。它们以相同的方式工作(output.foo为您提供了输出foo的值)。如果您希望使用R表达式作为条件参数,可以在服务器函数中创建一个反应式表达式并将其分配给新的输出,然后在条件表达式中引用该输出。
如果这样做,请确保还设置outputOptions(output,[newOutputName],suspendWhenHidden = FALSE)。(这是必要的,因为Shiny通常不会将隐藏或不存在于UI中的输出的值发送到浏览器。但是,在这种情况下,浏览器确实需要按顺序知道最新的输出值正确评估contitionalPanel函数的条件-suspendedWhenHidden = 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)
Run Code Online (Sandbox Code Playgroud)
另一种方法是转到renderUI条件面板,并显示它直到input$num_input更改。