2016-08-22 46 views
0

在Shiny中,我使用renderUItagList在服務器元素中動態創建UI,然後使用uiOutput顯示它。它的工作原理,但我想分解成uiOutput的內容。我怎麼做?uiOutput中閃爍的列

下面是Shiny圖庫中的(稍微縮寫的)Dynamic UI示例。請注意0​​如何包含最終顯示爲一列的tagList,但我希望它顯示爲兩列。

請注意,我不能撥打renderUI內部的column

library(shiny) 

server <- shinyServer(function(input, output) { 
    output$ui <- renderUI({ 
    if (is.null(input$input_type)) {return()} 
    tagList(list(div("Want this to be left column"), 
     switch(input$input_type, 
      "slider" = sliderInput("dynamic", "Want this to be right column", 
            min = 1, max = 20, value = 10), 
      "text" = textInput("dynamic", "Want this to be right column", 
           value = "starting value"), 
      "numeric" = numericInput("dynamic", "Want this to be right column", 
            value = 12), 
      "checkbox" = checkboxInput("dynamic", "Want this to be right column", 
             value = TRUE)))) 
    }) 
    output$input_type_text <- renderText({input$input_type}) 
    output$dynamic_value <- renderPrint({str(input$dynamic)}) 
}) 

ui <- shinyUI(fluidPage(
    titlePanel("Dynamically generated user interface components"), 
    wellPanel(selectInput("input_type", "Input type", 
         c("slider", "text", "numeric", "checkbox") 
)), 
    wellPanel(uiOutput("ui")), 
    wellPanel(
    tags$p("Input type:"), 
    verbatimTextOutput("input_type_text"), 
    tags$p("Dynamic input value:"), 
    verbatimTextOutput("dynamic_value") 
) 
)) 

shinyApp(ui = ui, server = server) 

回答

1

而是包裝div的widget和入選list然後進入tagList(你不需要他們兩人 - 其中之一即可)

tagList(list(div("Want this to be left column"), switch(...) ...) 

創建fluidRow並添加兩列 - 一個與div和另一個與switch

fluidRow(column(6, div("Want this to be left column")), 
     column(6, switch(input$input_type, 
         "slider" = sliderInput("dynamic", "Want this to be right column", 
               min = 1, max = 20, value = 10), 
         "text" = textInput("dynamic", "Want this to be right column", 
              value = "starting value"), 
         "numeric" = numericInput("dynamic", "Want this to be right column", 
                value = 12), 
         "checkbox" = checkboxInput("dynamic", "Want this to be right column", 
                value = TRUE) 
       ) 
     ) 
     ) 

完整的示例:

library(shiny) 

server <- shinyServer(function(input, output) { 
    output$ui <- renderUI({ 
    if (is.null(input$input_type)) {return()} 
    fluidRow(column(6, div("Want this to be left column")), 
      column(6, switch(input$input_type, 
           "slider" = sliderInput("dynamic", "Want this to be right column", 
                min = 1, max = 20, value = 10), 
           "text" = textInput("dynamic", "Want this to be right column", 
               value = "starting value"), 
           "numeric" = numericInput("dynamic", "Want this to be right column", 
                 value = 12), 
           "checkbox" = checkboxInput("dynamic", "Want this to be right column", 
                 value = TRUE) 
      ) 
      ) 
    ) 
    }) 
    output$input_type_text <- renderText({input$input_type}) 
    output$dynamic_value <- renderPrint({str(input$dynamic)}) 
}) 

ui <- shinyUI(fluidPage(
    titlePanel("Dynamically generated user interface components"), 
    wellPanel(selectInput("input_type", "Input type", 
         c("slider", "text", "numeric", "checkbox") 
)), 
    wellPanel(uiOutput("ui")), 
    wellPanel(
    tags$p("Input type:"), 
    verbatimTextOutput("input_type_text"), 
    tags$p("Dynamic input value:"), 
    verbatimTextOutput("dynamic_value") 
) 
)) 

shinyApp(ui = ui, server = server)