блестящий: insertUI с идентификатором, ранее удаленным с помощью removeUI - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть один код, в котором я добавляю и удаляю объекты, используя 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))

Проблема, с которой я сталкиваюсь, заключается в том, что если я добавляю один пользовательский интерфейс (нажмите «Добавить»), затем удаляю его (нажмите «Удалить фильтр»), а затем добавляю новый (нажмите «Добавить снова»), при первом нажатии на нем не работает.

Я знаю, что это связано с тем, что я использую идентификатор, который я использовал ранее, но теоретически я полностью удалил его с помощью инструкции removeUI.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 14 сентября 2018

Хотя я считаю, что должен быть более элегантный способ решения этой проблемы, я нашел обходной путь, который решает ее.

Итак, я добавил к идентификатору объекта, который я создаюслучайная строка, которую я создал;таким образом, идентификатор никогда не будет повторяться.

library(shiny)

generateRandomString <- function(n = 10, m = 10) {
  elements <- c()

  chars <- c(LETTERS, letters)

  for(idx in 1:n) {
    element <- c()

    for(entry in 1:m) {
      val <- sample(c("pair","odd"),1)

      switch(val,
        pair = {
          # Add a letter
          element <- c(element, sample(chars,1))
        },
        odd = {
          # Add a number
          element <- c(element, as.character(sample(0:9,1)))
        }
      )
    }

    elements <- c(elements, paste0(element,collapse=""))
  }

  elements
}

# 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)

    prefix <- generateRandomString(1,20)
    filterId <- paste0(prefix,'_adder_', add)
    divId <- paste0(prefix,'_adder_div_', add)
    elementFilterId <- paste0(prefix,'_adder_object_', add)
    removeFilterId <- paste0(prefix,'_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))

Существуют лучшие способы создания такой случайной строки, но дело в том, что проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...