有没有办法在Shiny应用程序中的fluidRow中动态插入/添加UI

时间:2016-11-16 18:27:04

标签: r user-interface shiny

我正在尝试创建一个闪亮的应用程序,允许我动态添加UI控件小部件。但是,当前代码将为每个新UI小部件添加一个新行。有没有办法将它们添加到fluidRow中,这样每行最多可以占用4个小部件。

此外,有没有办法添加/删除控件小部件而不会默认所有当前选择?我现在的代码基本上重新生成控件小部件,一旦“添加”或“删除”按钮被点击,这意味着所有选择将重置为默认值。

非常感谢你的帮助。 代码如下。

谢谢!

library(shiny)

ui <- shinyUI(fluidPage(


  mainPanel(
    actionButton("add_btn", "Add Box"),
    actionButton("rm_btn", "Remove Box"),
    uiOutput("interactionUI"))

))

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

  # Track the number of input boxes to render
  counter <- reactiveValues(n = 0)

  observeEvent(input$add_btn, {counter$n <- counter$n + 1})
  observeEvent(input$rm_btn, {
    if (counter$n > 0) counter$n <- counter$n - 1
  })


  interaction <- reactive({

    n <- counter$n

    if (n > 0) {
      lapply(seq_len(n), function(i) {
        selectInput(inputId = paste0("item", i),
                    label = paste0("Item", i), choices=c("test","test2"),
                    selected = NULL,
                    multiple = 8, selectize = TRUE, width = "20%", size = NULL)
      })
    }

  })

  output$interactionUI <- renderUI({ interaction() })

})

shinyApp(ui, server)

2 个答案:

答案 0 :(得分:0)

在流体行中添加id标记的div,然后将此id引用为插入列的选择器。

fluidRow(tags$div(id="rowLabel",column(4,"Example1",textOutput("example1"))))

insertUI(selector = "#rowLabel",where = "afterEnd",ui = tags$div(id="columnLabel",column(4,"Example2",textOutput("example2"))))

我将div id包装器添加到插入的列中,以便以后轻松删除。

答案 1 :(得分:0)

我知道这是一个古老的问题,但是我也遇到了同样的问题,并且认为分享我的解决方案会很好。 我从https://www.r-bloggers.com/dynamic-ui-elements-in-shiny/

获得了灵感

基本上,您应该将lapply调用中的UI元素存储在一个变量中,然后将do.call()与首选的Shiny布局一起使用(在我的情况下,flowLayout产生的效果比fluidRow更好)。

    pos_i = i / n_col
    int(pos_i)
    pos_j = i % n_col
    int(pos_j)