ignoreInit не работает с динамическим контентом - PullRequest
0 голосов
/ 18 января 2019

Это кросс-пост от 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)

1 Ответ

0 голосов
/ 19 января 2019

К сожалению, я не могу комментировать из-за отсутствия репутации, но вот мои мысли:

Я полагаю, что наблюдаемые события блокируются при инициализации. Но после этого вы визуализируете элемент пользовательского интерфейса. Входные данные $ dynamicBox изменяются с NULL на FALSE, что вызывает функцию Наблюдение за событием.

Вы можете подделать поведение, введя уникальную глобальную переменную в сеансе, скажем unique_init_variable << - FALSE, а затем измените ее на true, как только вы используете флажок. Вот пример кода </p>

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)
...