有没有办法限制对用户更新元素的反应?

时间:2015-10-28 17:59:06

标签: r shiny rstudio

在我的RStudio闪亮应用程序中,我有观察者更新selectInputs。有没有办法避免一连串的反应?如果用户更改input1,我希望它更新input2。但是我不想让它触发对input3的更新,这就是下面发生的事情。

例如,如果我可以将等效的isolate放在一起并更新,那将是理想的:

isolate(updateSelectInput())

这样它可以进行初始更新,但不会触发任何其他更改。

这可能吗?

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


  observeEvent(input$input1, {
    updateSelectInput(session, "input2", selected="3")

  })


  observeEvent(input$input2, {
    updateNumericInput(session, "input3",value=round(rnorm(1),2))
    # resetting input 2
    updateSelectInput(session, "input2", selected="1")
  })


}

ui<-fluidPage(

  # Application title
  titlePanel("Hello Shiny!"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
        selectInput("input1", label="Input1", choices=c("a", "b", "c"), selected="a"),
        selectInput("input2", label="Input2", choices=c("1", "2", "3"), selected="1"),
        numericInput("input3", label="Input3", value=3)
    ),

    mainPanel(

    )
  )
)

shinyApp(ui=ui, server=server)

1 个答案:

答案 0 :(得分:0)

我同意Pork Chop的说法,你可能更好地重新思考这个设计并以其他方式触发更新(但我猜你最了解你的应用)。有一种简单而丑陋的方法可以解决这个问题,并且仍然有相同的观察者:

C3

修改1 一个更通用的解决方案,但仍然很难看。

server<-function(session, input, output) {
  run.once <<- FALSE

  observeEvent(input$input1, {
    run.once <<- TRUE
    updateSelectInput(session, "input2", selected="3")
  })


  observeEvent(input$input2, {
    if (run.once==TRUE){
      run.once <<- FALSE
      return(NULL) 
    } 
    updateNumericInput(session, "input3",value=round(rnorm(1),2))
    # resetting input 2
    updateSelectInput(session, "input2", selected="1")
  })


}

ui<-fluidPage(

  # Application title
  titlePanel("Hello Shiny!"),

  # Sidebar with a slider input for the number of bins
  sidebarLayout(
    sidebarPanel(
      selectInput("input1", label="Input1", choices=c("a", "b", "c"), selected="a"),
      selectInput("input2", label="Input2", choices=c("1", "2", "3"), selected="1"),
      numericInput("input3", label="Input3", value=3)
    ),

    mainPanel(

    )
  )
)

shinyApp(ui=ui, server=server)

希望这有帮助