初始化应用程序时,条件面板消息闪烁,然后消失

时间:2019-09-13 01:42:33

标签: shiny

当我运行以下应用程序时,条件面板语句中的红色消息会闪烁并消失。有人可以解释原因以及如何删除它吗?

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)

2 个答案:

答案 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)

我希望这可以阐明这个问题。