我正在尝试创建一个闪亮的应用程序,允许我动态添加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)
答案 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)