#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 заставит его запускаться «часто». Я все еще не понимаю, но все равно спасибо…