Проблема при вставке интерфейса после удаления интерфейса - PullRequest
2 голосов
/ 02 марта 2020

Я пытаюсь удалить интерфейс в блестящем приложении. У меня есть код для удаления каждого элемента пользовательского интерфейса отдельно с отдельными кнопками удаления. Но, кроме того, я также хотел бы, чтобы кнопка удаления c в общем случае удаляла все вставленные элементы интерфейса одновременно. Для этой задачи я попробовал селектор из insertUI и смог удалить все добавленные интерфейсы.

Но после выполнения этой конкретной задачи c, то есть после одновременного удаления всех пользовательских интерфейсов, «блестящий» не позволяет мне вставлять новые пользовательские интерфейсы. Кажется, что идентификатор подразделения был удален навсегда и не может быть восстановлен даже после вызова кнопки добавления. Как решить эту проблему, пожалуйста, кто-нибудь направляет меня.

Ниже приведен работоспособный код, принятый из stackoverflow

 library(shiny)

   ui <- fluidPage(


 sidebarLayout(
     sidebarPanel(

     actionButton('addBtn', 'Add input Set'),
     actionButton("remove","Delete"),


  tags$div(id='inputList')
),
mainPanel()
))

  server <- function(input, output) {

     observeEvent(input$addBtn, {

       # Increment by 1
       nr <- input$addBtn + 1

       # Creating a list of IDs based on our increments

       id <- paste0("input",nr)
       row_id <- paste0("newInput",nr)

       # Inserting the UIs

  insertUI(
       selector = '#inputList',
        ui=div(
         id = row_id,
         selectizeInput(
           inputId = id,
           choices = c("Stuff","to","input"),
           selected = c("Stuff"),
           label = "An Input:"          
      ),


    actionButton(paste0('removeBtn',nr), 'Remove')
    )
  )

  # Removes UI seperately 
  # Uses Seperate remove button for each ui

    observeEvent(input[[paste0('removeBtn',nr)]],{
      shiny::removeUI(
       selector = paste0("#newInput",nr)
    )
    })  

 })

 # Remove all the added UIs at once
 # InsertUI doesn't work after this


 observeEvent(input$remove,{

    removeUI(selector = "#inputList")


    })

 }

   shinyApp(ui, server)

1 Ответ

2 голосов
/ 02 марта 2020

Это нормально, потому что ваш removeUI удаляет div(id = "inputList"). Поэтому после этого insertUI s не находят этот div.

Используйте вместо этого:

removeUI(selector = "#inputList *", multiple = TRUE)

Селектор CSS #inputList * выбирает всех потомков #inputList, но не #inputList.

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