2016-08-22 82 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)