在 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)
在下面的 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)