2017-12-13 4 views
1

Ich erstelle gerade eine shiny App, irgendwo in meiner App erwarte ich eine beliebige Anzahl von Eingaben, die der Benutzer aus einer Zeile von selectInput() Widgets angeben kann.Ausblenden von Widgets, die in einer TagListe in shiny erstellt wurden

Da die Anzahl der selectInput() Widgets möglicherweise groß ist, möchte ich, dass die nächsten selectInput() Widget zeigt nur, wenn die vorherige ist vom Benutzer gefüllt.

Meine Idee ist, dass ich will:

  1. schaffen alle möglichen selectInput() Widgets in einem tagList,
  2. sie alle standardmäßig ausblenden und
  3. zeigen die nächste, wenn der vorherige gefüllt ist.

Ich bin gut mit dem ersten und den dritten Schritt, aber als ich versuchte, sie all hide mit der shinyjs Funktion zu verstecken, wie es scheint es nicht für die Eingabe von Objekten in einem tagList erstellt funktioniert, es funktioniert nur für die Widgets dass mit einem bestimmten Namen erstellt wird, finden Sie im folgenden Beispiel:

library(shiny) 
library(shinyjs) 

ui <- fluidPage(

# Application title 
titlePanel("Hello Shiny!"), 

sidebarLayout(

    # Sidebar with a slider input 
    sidebarPanel(
     sliderInput("obs", 
        "Number of observations:", 
        min = 0, 
        max = 1000, 
        value = 500) 
    ), 

    # Show a plot of the generated distribution 
    mainPanel(
     useShinyjs(), 
    uiOutput('comparisons') 
    ) 
) 



server <- shinyServer(function(input, output, session) { 

    observe(1, shinyjs::hide('compare_1')) 
    output$comparisons=renderUI({ 
     out=tagList() 
     out=lapply(1:6, function(x){ 
      selectizeInput(paste0('compare_',x), 
         label = 'Condition 1', 
         c('aa','bb', 'cc')) 
     }) 
     out 
    }) 

}) 

shinyApp(ui, server) 

Say ich erstelle 6 selectInput Widgets, nennen sie compare_1-compare_6, habe ich auch sliderInput ein genannt obs nur als ein Beispiel zu zeigen. In Server, wenn ich nur shinyjs::hide('obs') sage, wird die sliderInput ausgeblendet werden, aber wenn ich shinyjs::hide('compare_1') aufrufen, ist die selectInput immer noch da. Jede Idee wird geschätzt!

Antwort

1

Hallo können Sie tun, mit conditinalPanel ganz einfach

ui <- fluidPage(

    # Application title 
    titlePanel("Hello Shiny!"), 

    sidebarLayout(

    # Sidebar with a slider input 
    sidebarPanel(
     sliderInput("obs", 
        "Number of observations:", 
        min = 0, 
        max = 1000, 
        value = 500) 
    ), 

    # Show a plot of the generated distribution 
    mainPanel(
     useShinyjs(), 
     uiOutput('comparisons') 
    ) 
) 
) 


server <- shinyServer(function(input, output, session) { 

    output$comparisons=renderUI({ 
    out=tagList(
     selectizeInput(paste0('compare_1'), 
        label = 'Condition 1', 
        c("",'aa','bb', 'cc')), 
     lapply(2:6, function(x){ 
     conditionalPanel(
      paste0("input.compare_",x-1," != ''"), 
      selectizeInput(paste0('compare_',x), 
         label = paste0('Condition ',x), 
         c("",'aa','bb', 'cc')) 
     ) 
     }) 
    ) 
    out 
    }) 



}) 

shinyApp(ui, server) 
+0

Das ist eine schöne Lösung ist! – Florian

+0

Dies ist genau das, was ich gesucht habe, danke !! – Sni

Verwandte Themen