Это кросс-пост от github , чтобы получить больше тяги.
Я узнал, что observeEvent
запускается при запуске, когда пользовательский интерфейс создается динамически, даже с ignoreInit=TRUE
. Я нашел этот поток в stackoverflow , но представленное решение не работает для checkboxInput
, поскольку значение eventExpr
равно либо T/F
, поэтому невозможно определить, будет ли это первый вызов во время инициализация или обычный вызов.
В приведенном ниже минимальном рабочем примере я нашел обходной путь с помощью shinyjs::delay
, но я не уверен, что это всегда будет работать, и какое минимальное время задержки требуется.
Для меня ignoreInit
также должен работать для динамических интерфейсов, то есть наблюдатель для dynamicBox
не должен запускаться при инициализации, как в случае staticBox
. Есть ли шанс исправить эту проблему или это ожидаемое поведение?
library(shinydashboard)
library(shiny)
library(shinyjs)
ui <- dashboardPage(
dashboardHeader(title = "observeEvent ignoreInit"),
dashboardSidebar(),
dashboardBody(
useShinyjs(),
checkboxInput("staticBox", "static"),
uiOutput("body"))
)
server <- function(input, output, session) {
output$body <- renderUI( tagList(
checkboxInput("dynamicBox", "dynamic"),
checkboxInput("dynamicBoxDelayed", "dynamic delayed")
))
# observe static checkBox
observeEvent(input$staticBox, {
cat("observeEvent of static checkBox is executed\n")
}, ignoreInit=TRUE)
# observe dynamic checkBox
observeEvent(input$dynamicBox, {
# this is executed upon start, although ignoreInit is set to TRUE
cat("observeEvent of dynamic checkBox is executed\n")
cat( paste0("dynamicBox value = '", input$dynamicBox, "'\n") )
}, ignoreInit=TRUE)
# observe dynamicDelayed checkBox
shinyjs::delay(100, {
observeEvent(input$dynamicBoxDelayed, {
cat("observeEvent of dynamic checkBoxDelayed is executed\n")
}, ignoreInit=TRUE)
})
}
shinyApp(ui, server)