2016-05-04 4 views
2

sidebarPaneltabPanelを追加して削除するボタンを設定したsidebarLayoutアプリがあります。しかし、私はどのようにこれらのtabPanelsをカスタマイズするのか分かりません。私のコードは以下の通りです:ShinyのボタンをクリックしてtabPanelをカスタマイズする方法

library(shiny) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(width = 3, fixed=T, 
     h3("L2 Machine"), 
     actionButton('moreL2', tags$b('Add L2')), 
     actionButton('lessL2', tags$b('Remove L2')), 
     uiOutput('panelset'), 
     tabPanel("L2panel", 
     numericInput(inputId='L2amount', 'Select L2 Amount', value=0), 
     selectInput(inputId='L2type', 'Select L2 Type', c('Percent', 'Absolute')), 
     uiOutput('L2daterange') 
    ) 
    ), 
    mainPanel(
     verbatimTextOutput('L2a'), 
     verbatimTextOutput('L2t') 
    ) 
) 
) 

server <- function(input, output) { 

    output$L2a <- renderPrint(input$L2amount) 
    output$L2t <- renderPrint(input$L2type) 

    output$panelset <- renderUI({ 
    n <- seq(max(input$moreL2 - input$lessL2 + 1, 1)) 
    tabList <- lapply(paste("Pan", n), tabPanel) 
    do.call(tabsetPanel, tabList) 
    }) 

    output$L2daterange <- renderUI({ 
    dateRangeInput(inputId='L2daterange', 
     label='Select Adjustment Period', 
     start='01-01-2010', end='01-12-2015' 
    ) 
    }) 
} 

shinyApp(ui, server) 

現在、私はtabPanel()numericInput()selectInput()、そしてuiOutput()を持っています。代わりに、tabPanelボタンをクリックして "Add L2"を作成して、numericInputselectInputuiOutputという独自のセットを作成します。

答えて

2

実際には別のtabPanelsを作成しますが、それらは空です。numericInputselectInputの両方が動的タブパネル内にありません。この解決策はhttps://gist.github.com/wch/5436415/に基づいており、forループを使用して出力をレンダリングするには、なぜ関数localが必要なのかという広範な説明があります。


前述のように、正しく動的タブパネルを作成しましたが、それらは空です。 lapply内では、一意のウィジェットをtabPanelの引数として指定する必要があります。

output$panelset <- renderUI({ 
    n <- seq(max(input$moreL2 - input$lessL2 + 1, 1)) 
    tabList <- lapply(paste("Pan", n), tabPanel) 
    do.call(tabsetPanel, tabList) 
    }) 

ここでは、正しい方法でどのように行うことができるかの例を示しました。ユニークなウィジェットのセットを持つユニークなtabPanelを作成するたびに、

tabList <- lapply(n, function(i) { 
     tabPanel(
     title = paste0('Pan', i), 

     numericInput(inputId = paste0('L2amount', i), 'Select L2 Amount', value = 0), 

     selectInput(inputId = paste0('L2type', i), 'Select L2 Type', c('Percent', 'Absolute')), 

     dateRangeInput(inputId = paste0('L2daterange',i), 
        label = 'Select Adjustment Period', 
        start = '01-01-2010', end = '01-12-2015')) 

    }) 
    do.call(tabsetPanel, tabList) 

    }) 

その後、あなたは出力のユニークなセットを作成する必要があり、その後、あなたのウィジェットの値をレンダリングすることができ、ウィジェットの固有のセットを持つ各タブパネルのため。


完全なソリューション:

library(shiny) 

ui <- fluidPage(
    sidebarLayout(
    sidebarPanel(width = 3, fixed=T, 
       h3("L2 Machine"), 
       actionButton('moreL2', tags$b('Add L2')), 
       actionButton('lessL2', tags$b('Remove L2')), 
       uiOutput('panelset') 
    ), 
    mainPanel(
     uiOutput("dynamic") 
    ) 
) 
) 


TMAX <- 10 # specify maximal number of dynamic panels 
server <- function(input, output) { 



    output$panelset <- renderUI({ 

    n <- seq(max(input$moreL2 - input$lessL2 + 1, 1)) 

    # You have to create each time a new set of unique widgets 
    tabList <- lapply(n, function(i) { 
     tabPanel(
     title = paste0('Pan', i), 

     numericInput(inputId = paste0('L2amount', i), 'Select L2 Amount', value = 0), 

     selectInput(inputId = paste0('L2type', i), 'Select L2 Type', c('Percent', 'Absolute')), 

     dateRangeInput(inputId = paste0('L2daterange',i), 
        label = 'Select Adjustment Period', 
        start = '01-01-2010', end = '01-12-2015')) 

    }) 
    do.call(tabsetPanel, tabList) 

    }) 


    output$dynamic <- renderUI({ 
     n <- seq(max(input$moreL2 - input$lessL2 + 1, 1)) 

     # You want to render n-times different outputs and each time you have 
     # k different outputs -- > need a list within a list. 
     lapply(n, function(i) { 

     list(
      h5(paste0("Pan", i, " widgets")), 

      verbatimTextOutput(paste0('L2a', i)), 
      verbatimTextOutput(paste0('L2t', i)), 
      verbatimTextOutput(paste0('L2dat', i)), 

      br() 
     ) 
     }) 
    }) 

    for (i in 1:TMAX) { 

     local({ 
     my_i <- i 

     # Outputs 
     L2a <- paste0('L2a', my_i) 
     L2t <- paste0('L2t', my_i) 
     L2dat <- paste0('L2dat', my_i) 

     list( 
      output[[L2a]] <- renderPrint({ input[[paste0('L2amount', my_i)]] }), 

      output[[L2t]] <- renderPrint({ input[[paste0('L2type', my_i)]] }), 

      output[[L2dat]] <- renderPrint({ input[[paste0('L2daterange', my_i)]] }) 
     ) 
     }) 
    } 

} 

shinyApp(ui, server) 
+0

おかげで、@UnnamedUser!これはうまくいって、説明は素晴らしかった! –

関連する問題