2017-10-13 83 views
1

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

但是,這並不工作之一:應用程序經常打開,一旦評估按鈕被點擊顯示在有條件的面板,但沒有任何反應,一旦號碼被改變。

回答

2

您可以創建輸出值並僅將其用於條件面板。動態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

我從來沒有玩過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面板。