当我运行以下应用程序时,条件面板语句中的红色消息会闪烁并消失。有人可以解释原因以及如何删除它吗?
library(shiny)
ui <- fluidPage(
numericInput("num", "Choose a number",1.1,1,10),
conditionalPanel(
condition = "output.square",
div("That's a perfect square!",style="color:red; height:400px")
)
)
server <- function(input, output, session) {
output$square <- reactive({
sqrt(as.numeric(input$num)) %% 1 == 0
})
outputOptions(output, 'square', suspendWhenHidden = FALSE)
}
shinyApp(ui = ui, server = server)
答案 0 :(得分:1)
以下代码具有相同的功能,但删除了条件面板闪光灯-这对您有用还是您需要使用conditionalPanel
?
library(shiny)
ui <- fluidPage(
numericInput("num", "Choose a number",
value = 1.1,
min = 1,
max = 10),
uiOutput("text")
)
server <- function(input, output, session) {
output$text <- renderUI({
if(sqrt(as.numeric(input$num)) %% 1 == 0){
div("That's a perfect square!",style="color:red; height:400px")
}
else{
div("",style="color:red; height:400px")
}
})
}
shinyApp(ui = ui, server = server)
答案 1 :(得分:1)
更新后的修订答案
在解决闪烁的红色消息的实际问题之前:
以前,我认为问题与输出(output$square
)被定义为反应性这一事实有关。我认为这行不通,并且会导致错误。但是,尽管这绝对不是要使用光泽的方式(reactive
代表“反应性导体”,而output
代表“反应性端点”),但是您的方法似乎有效。
一种更闪亮的方法可以利用renderUI。下面,我有意地包括了(中间)反应。
library(shiny)
ui <- fluidPage(
numericInput("num", "Choose a number",1.1,1,10),
uiOutput("text")
)
server <- function(input, output, session) {
square_out <- reactive({
sqrt(as.numeric(input$num)) %% 1 == 0
})
output$text <- renderUI({
if (square_out()) {
div("That's a perfect square!",style="color:red; height:400px")
}
})
}
shinyApp(ui = ui, server = server)
此反应在开始时会导致非常闪烁的消息。原因是启动应用程序时,尚未评估反应式,即在R中为NULL。在javascript中,这表示为:
toJSON(NULL)
> {}
这是一个空条件,等效于true
。这样便显示该消息。然后,对反应式进行评估,条件开始生效,隐藏消息。
因此,更好的方法是使用Gregs方法并将条件放入renderUI
语句中(请参阅他的答案)。在此,仅在评估时以及评估条件时才显示UI元素。这里不可能在尚未生成/评估生成条件的部分的情况下显示UI元素。
因此,我的第二种方法也无助于消除闪烁的消息。这里的想法是生成一个textOutput
并将其用作条件面板的条件,但是,出现了与反应式相同的问题:一开始它尚未评估,并且出现红色消息。
library(shiny)
ui <- fluidPage(
numericInput("num", "Choose a number",1.1,1,10),
conditionalPanel(
condition = "output.text == 'TRUE'",
div("That's a perfect square!",style="color:red; height:400px")
),
textOutput("text")
)
server <- function(input, output, session) {
output$text <- renderText({
print(sqrt(as.numeric(input$num)) %% 1 == 0)
sqrt(as.numeric(input$num)) %% 1 == 0
})
}
shinyApp(ui = ui, server = server)
我希望这可以阐明这个问题。