Повторный запуск одного и того же пользовательского интерфейса больше раз

#shiny

#блестящий

Вопрос:

У меня есть это простое блестящее приложение с двумя кнопками действий. Кнопка «Render» отображает элемент управления вводом слайдера, в то время как кнопка «Remove» удаляет тот же ввод слайдера. В первый раз это работает нормально, но попытка повторно отобразить тот же ввод с помощью слайдера во второй раз не работает. Есть идеи или объяснения, что может быть не так с кодом?

Это код:

     ui <- fluidPage(
            actionButton("render", "Render"),
            actionButton("remove", "Remove"),
            uiOutput("moreControls")
    )

    server <- function(input, output) {
            observeEvent(input$render, {
                    if (input$render > 0) {
                            output$moreControls <- renderUI({
                                    tagList(
                                            sliderInput("n", "N", 1, 1000, 500)
                                    )
                            })    
                    }
            })
            observeEvent(input$remove, {
                    if (input$remove > 0) {
                            removeUI(
                                    selector = "div[id='moreControls']"
                            )
                    }
            })

    }
    shinyApp(ui, server)
  

Ответ №1:

Вы можете присвоить элементу управления значение NULL, чтобы удалить его. Смотрите код.

 library(shiny)  

ui <- fluidPage(
  actionButton("render", "Render"),
  actionButton("remove", "Remove"),
  uiOutput("moreControls")
)

server <- function(input, output) { 

  rv <- reactiveValues() 

  observeEvent(input$render, { rv$action <- 'render' })
  observeEvent(input$remove, { rv$action <- 'remove' }) 

  output$moreControls <- renderUI({ 

    if (is.null(rv$action)) {return(NULL)} 

    if(rv$action == 'render'){ 
      sliderInput(inputId = "n",label =  "N", min = 1, max = 1000, value = 500)    
    } else {  
      return(NULL)
    } 
  }) 
}
shinyApp(ui, server)
  

Комментарии:

1. Спасибо за ответ. Есть идеи, что не так с моим кодом?

2. removeUI удаляет ползунок, его нельзя обновить. Вы можете сгенерировать новый с помощью insertUI.

3. Что меня смущает, так это то, что я использую renderUI, а не updateUI для повторного отображения слайдера. Ваше решение работает, но я не могу объяснить себе, почему мой код не работает…

4. Смотрите 3. выполнение в shiny.rstudio.com/articles/cheatsheet.html . вывод $ moreControls выполняется один раз при инициализации приложения. Код внутри вывода $ moreControls будет выполняться ‘часто’.

5. Для этого нужно некоторое время. Я думал, что включение renderUI в observeEvent заставит его запускаться «часто». Я все еще не понимаю, но все равно спасибо…