在Shiny

时间:2017-02-10 17:44:23

标签: r shiny

在Shiny中,观察语句在app load上运行,我想在某些情况下阻止这种情况。例如,我可能有两个标题,我想以某个值开始,在应用加载后我希望它们同步。

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

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

我问related question,那个问题的答案同样不优雅。有什么想法吗?

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)

1 个答案:

答案 0 :(得分:2)

你要找的东西是ignoreInit。见下文

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

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