Удалить и вставить элемент пользовательского интерфейса в один объект ObserveEvent в Shiny - PullRequest
0 голосов
/ 13 июня 2019

Я строю приборную панель с 3 ящиками для выбора. Когда пользователь выбирает параметр в одном окне выбора, параметры оставшихся невыбранных фильтров будут обновлены. Обновление может занять несколько секунд. Для заданного поля ввода selectizeinput можно выбрать до 3 вариантов. Выбор опции обрабатывается в наблюдаемом событии. В реальном приложении есть несколько наблюдаемых событий для обработки выбора параметров в нескольких полях выбора ввода.

Я хочу, чтобы маленькая кнопка с надписью «Готово» появлялась под полями selectizeinput только после обновления. Это работает для первого варианта, который выбран. Когда пользователь выбирает вторую опцию из того же поля selectizeinput, я хочу, чтобы кнопка «Готово» исчезала и появлялась снова только тогда, когда обновляются другие поля selectizeinput. Я попытался использовать removeUI и insertUI для этой цели, но он не работает.

Я уже пробовал использовать hide (), show () и toggle () библиотеки блестящей библиотеки, чтобы скрыть кнопку действия «Готово» во время обновления и показывать ее только после завершения обновления. Но это не сработало.

ui.R

sidebar <- shinydashboard::dashboardSidebar(

  sidebarMenu(
              id = "sidebarmenu",
              menuItem(h4("Sample"), tabName = "map"),
              conditionalPanel("input.sidebarmenu === 'map'",
                               selectizeInput(
                                 "srcLoc", label="Filter 1", choices=srcC, selected=NULL, multiple=TRUE, options=list(maxItems=nSrc, placeholder="")
                               )
                               ,
                               selectizeInput(
                                 "srcCity", label="Filter 2", choices=NULL, selected=NULL, multiple=TRUE, options=list(maxItems=nCity, placeholder="")
                               ),
                               selectizeInput(
                                 "destLoc", label="Filter 3", choices=destT, selected=NULL, multiple=TRUE, options=list(maxItems=nDest, placeholder="")
                               ),
                               tags$div(id="placeholder")

              )
  )
  )

body <- shinydashboard::dashboardBody(
  tabItems(
    tabItem(tabName="map"
    )
  )
)

dashboardPage(
  dashboardHeader(title = "Trial"),
  sidebar,
  body
)

server.R

shinyServer<- function(input,output,session) {

  observeEvent(input$srcLoc, {
    removeUI("#done")
    if (!is.null(input$srcLoc) & is.null(input$srcCity) & is.null(input$destLoc)) {
      df <- getDf(locsAgg, srcc, destt, srcregg, destregg, regionCountryCity, input$srcLoc, input$srcCity, input$destLoc)

      if (length(input$srcLoc)>1) {
        locc <- paste(input$srcLoc, collapse=" -> ")
      } else {
        locc <- input$srcLoc
      }

      cities <- getCity4(df, locc, srcregg, srcc, regionCountryCity)
      sc <- sort(cities[!cities %in% c(NA,"NA")])
      if (length(sc) > 1) {
        sc <- as.data.table(sort(cities[!cities %in% c(NA,"NA")]))
      } 

      destChoice <- unique(getLocs2(df,"S"))
      destChoice <- destChoice[!destChoice %in% c(NA,"NA")]
      if (length(destChoice)>1) {
        destChoice <- as.data.table(destChoice)
      }

      updateSelectizeInput(session, "destLoc", 
                           choices=destChoice,
                           selected=input$destLoc,
                           options=list(placeholder="Select a Country",maxItems=nDest))
      updateSelectizeInput(session, "srcCity",
                           choices=sc,
                           selected=input$srcCity,
                           options=list(placeholder="Select a City",maxItems=nCity))
      insertUI("#placeholder",where="afterEnd",ui = 
    }
  })

}

Есть ли способ заставить эту работу? Спасибо!

...