我有一个代码,其中可以使用insertUI和removeUI在其中添加和删除对象,如下所示:
library(shiny)
# Define the UI
ui <- fluidPage(
actionButton("adder", "Add"),
tags$div(id = 'placeholder')
)
# Define the server code
server <- function(input, output) {
rv <- reactiveValues()
rv$counter <- 0
observeEvent(input$adder,{
rv$counter <- rv$counter + 1
add <- sprintf("%03d",rv$counter)
filterId <- paste0('adder_', add)
divId <- paste0('adder_div_', add)
elementFilterId <- paste0('adder_object_', add)
removeFilterId <- paste0('remover_', add)
insertUI(
selector = '#placeholder',
ui = tags$div(
id = divId,
actionButton(removeFilterId, label = "Remove filter", style = "float: right;"),
textInput(elementFilterId, label = "Introduce text", value = "")
)
)
# Observer that removes a filter
observeEvent(input[[removeFilterId]],{
rv$counter <- rv$counter - 1
removeUI(selector = paste0("#", divId))
})
})
}
# Return a Shiny app object
shinyApp(ui = ui, server = server, options = list(launch.browser = T))
我遇到的问题是,如果我第一次单击,则添加一个UI(单击“添加”),然后将其删除(单击“删除过滤器”),然后添加一个新的UI(再次单击“添加”)。对此不起作用。
我知道这是由于我使用的是以前使用的ID,但从理论上讲,我已经使用removeUI指令完全删除了它。
我在这里想念什么?
答案 0 :(得分:0)
仅供参考,有一种清除服务器上输入IDS的方法,因此您不会遇到相同的问题。我在这里找到了解决方案。
https://roh.engineering/post/shiny-add-removing-modules-dynamically/
本文详细介绍了很多内容,但是您可以使用以下功能从服务器中删除输入。
remove_shiny_inputs <- function(id, .input) {
invisible(
lapply(grep(id, names(.input), value = TRUE), function(i) {
.subset2(.input, "impl")$.values$remove(i)
})
)
}