2017-12-13 47 views
1

私は最近shinyというアプリをビルドしています。私のアプリのどこかで、ユーザがselectInput()ウィジェットから指定できる任意の数の入力を期待しています。tagListで作成されたウィジェットをshinyで表示しない

ウィジェットの数が多い可能性があるので、次のselectInput()ウィジェットは、そのウィジェットがユーザーによって埋められたときのみ表示されるようにしたいと思います。

私の考えは、私がすることです:

  1. tagListにすべての可能なselectInput()ウィジェットを作成、
  2. 、デフォルトではそれらすべてを隠し、そして
  3. は、以前のものが満たされたときに、次のいずれかを示しています。

Iは、第1および第3のステップと罰金ですが、私はshinyjs機能hideを使用して、それらすべてを隠そうとしたとき、それはそれはtagListで作成した入力オブジェクトに対して動作しないようですが、それだけでそれらのウィジェットのために働きますそれは、特定の名前で作成され、以下の例を参照してください。

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) 

は私がcompare_1compare_6にそれらに名前を付け、6つのselectInputウィジェットを作成するだと言う、私はまた、単なる例として示すことobsと呼ばれるsliderInputを作成しました。サーバーでは、shinyjs::hide('obs')と言うと、sliderInputは非表示になりますが、shinyjs::hide('compare_1')と呼ぶと、selectInputはまだ存在します。任意のアイデアをいただければ幸いです!

答えて

1

こんにちは、あなたは非常に簡単conditinalPanel

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

で素敵なソリューションですそのことを行うことができます! – Florian

+0

これはまさに私が探していたものです。ありがとう!! – Sni

関連する問題