ignoreInit не работает с динамическим контентом
Это кросс-пост от GitHub, чтобы получить больше тяги.
Я понял что observeEvent
запускается при запуске, когда пользовательский интерфейс создается динамически, даже если ignoreInit=TRUE
, Я нашел этот поток на stackru, но представленное решение не работает для 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)
1 ответ
К сожалению, я не могу комментировать из-за отсутствия репутации, но вот мои мысли:
Я полагаю, что наблюдаемые события блокируются при инициализации. Но после этого вы визуализируете элемент пользовательского интерфейса. Входные данные $dynamicBox изменяются с NULL на FALSE, что вызывает функцию Наблюдение за событием.
Вы можете подделать поведение, введя уникальную глобальную переменную в сеансе, скажем unique_init_variable << - FALSE, а затем измените ее на true, как только вы используете этот флажок. Вот пример кода
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) {
# unique init variable
unique_init_variable <<- FALSE
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, {
if (input$dynamicBox == TRUE) {
unique_init_variable <<- TRUE
}
if (unique_init_variable) {
# 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)