防止在 Shiny 中对应用程序加载执行观察

ZRo*_*oss 5 r shiny

在 Shiny 中,观察语句在应用程序加载时运行,我想在某些情况下阻止这种情况。例如,我可能有两个标题,我想以某个值启动,并且在应用程序加载后我希望它们同步。

在下面的代码中,如果您运行它,标题将在无限循环中更新,因为应用程序会立即更新一个标题,然后更新另一个标题,依此类推。如果您取消注释下面的“first_time”代码块之一,则两个标题将显示为以相同的值开头。如果您取消注释这两个块,那么它将执行我想要的操作 - 从预先指定的值开始,然后在进行更改时同步。

但这段代码很复杂,我不想if在所有观察者中添加语句。一定有更简单的方法。在查看文档时,似乎可能使用suspended = TRUEandresume()但我找不到示例。

我问了一个相关的问题,这个问题的答案同样不优雅。有什么想法吗?

library(shiny)

first_time1 <<- TRUE
first_time2 <<- TRUE

server <- function(input, output, session) {

  observeEvent(input$title1, {
    # if(first_time1){
    #   first_time1 <<- FALSE
    #   return()
    # }
    updateTextInput(session, "title2", value = input$title1)

  })

  observeEvent(input$title2, {
    # if(first_time2){
    #   first_time2 <<- FALSE
    #   return()
    # }
    updateTextInput(session, "title1", value = input$title2)
  })

} 

ui <- fluidPage(
  tabsetPanel(


    tabPanel("A", textInput("title1", "titleA", "This is the title A")),
    tabPanel("B", textInput("title2", "titleB", "This is title B"))
  )
)


shinyApp(ui = ui, server = server)
Run Code Online (Sandbox Code Playgroud)

Hao*_*Hao 4

您正在寻找的东西是ignoreInit。见下文

  observeEvent(input$title1, {
    updateTextInput(session, "title2", value = input$title1)
  }, ignoreInit = T)

  observeEvent(input$title2, {
    updateTextInput(session, "title1", value = input$title2)
  }, ignoreInit = T)
Run Code Online (Sandbox Code Playgroud)

  • 这对于observeEvent() 来说效果很好,但是如何防止使用observe() 创建的普通观察者在启动时被触发呢?observe() 没有ignoreInit 参数。 (8认同)