在 R Shiny 中,如何消除第一次调用 App 时 observeEvent 条件的闪烁?

In R Shiny, how to eliminate the flashing of observeEvent conditionals when first invoking the App?

在下面的 MWE 代码中,用户可以通过单击输入 2 的“显示”单选按钮来选择性地调用对象 input2。默认设置是隐藏 input2。然而,当第一次调用应用程序时,input2 在被 observeEvent.

隐藏之前快速闪过

这种闪烁在代码的非 MWE 版本中更加明显。

有一个相关的 post 解决了 conditionalPanel 的这个问题。但是这里没有conditionalPanel.

我不想用renderUI来解决这个问题!!由于 renderUI 有缺点我不想重新介绍。

MWE代码:

library(shiny)
library(shinyjs)

f <- function(action,i){as.character(checkboxInput(paste0(action,i),label=NULL))}
actions       <- c("show", "reset")
tbl           <- t(outer(actions, c(1,2), FUN = Vectorize(f)))
colnames(tbl) <- c("Show", "Reset")
rownames(tbl) <- c("Input 2", "Input 3")

ui <- fluidPage(
  useShinyjs(),
  tags$head(
    tags$style(HTML(
      "td .checkbox {margin-top: 0; margin-bottom: 0;}
       td .form-group {margin-bottom: 0;}"
    ))
  ),
  br(),
  sidebarLayout(
    sidebarPanel(
      numericInput("input1", "Input 1:", 10, min = 1, max = 100),
      h5(strong("Add inputs:")),
      tableOutput("checkboxes"),
      numericInput("input2", "Input 2:", 10, min = 1, max = 100),
    ),
    mainPanel()
  )    
)

server <- function(input, output, session){
  
  output[["checkboxes"]] <- 
    renderTable({tbl}, 
                rownames = TRUE, align = "c",
                sanitize.text.function = function(x) x
    )

  observeEvent(input[["show1"]], {
    if(input[["show1"]] %% 2 == 1){shinyjs::show(id = "input2")} else
      {shinyjs::hide(id = "input2")}
  })

}

shinyApp(ui, server)

在第一次调用 observerEvent 之前,事件循环需要一些时间。 默认情况下,它将显示在最开始。 这导致闪光灯。 只需将 input2 隐藏在 server 函数的开头即可:

server <- function(input, output, session) {
  # Avoid flashing
  shinyjs::hide(id = "input2")
  
  output[["checkboxes"]] <-
    renderTable(
      {
        tbl
      },
      rownames = TRUE,
      align = "c",
      sanitize.text.function = function(x) x
    )

  observeEvent(input[["show1"]], {
    if (input[["show1"]] %% 2 == 1) {
      shinyjs::show(id = "input2")
    } else {
      shinyjs::hide(id = "input2")
    }
  })
}

您也可以使用hidden

hidden(numericInput("input2", "Input 2:", 10, min = 1, max = 100))

toggle:

  observeEvent(input[["show1"]], {
    toggle("input2")
  },ignoreNULL = FALSE)