闪亮:具有先前通过removeUI删除的ID的insertUI

时间:2018-09-14 08:10:26

标签: javascript r shiny

我有一个代码,其中可以使用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指令完全删除了它。

我在这里想念什么?

1 个答案:

答案 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)
    })
  )
}