改变反应表达,保持观察者

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了改变反应表达,保持观察者相关的知识,希望对你有一定的参考价值。

如何覆盖/重新定义反应式表达式,同时保持所有观察者对该表达式的完整性?

下面的示例旨在让观察者听到按钮单击,但仅在单击按钮一次之后。在此之前,观察者应该对数字输入字段做出反应。 (请注意,如果可能,我希望观察者不受影响。我想重新定义反应式表达式。)

library(shiny)

ui <- fluidPage(
      numericInput(inputId="some_numbers",value=8,label = "Enter a number:"),
      actionButton(inputId = "button1",label="Update reactive expression")
)

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

  my_reactive_expr <- reactive({
    input$some_numbers
  })

  observeEvent(my_reactive_expr(),{
    print("reactive value change detected!")
  })

  observeEvent(input$button1,{
    my_reactive_expr <<- reactive({
      input$button1
    })
  })

}

shinyApp(ui = ui, server = server)
答案

喜欢写在评论中我会建议像:

my_reactive_expr <- reactive({ 
    if(!input$button1) return(input$some_numbers)
    input$button1 
  })

完整的应用程序将读取:

library(shiny)

ui <- fluidPage(
  numericInput(inputId="some_numbers",value=8,label = "Enter a number:"),
  actionButton(inputId = "button1",label="Update reactive expression")
)

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

    my_reactive_expr <- reactive({ 
      if(!input$button1) return(input$some_numbers)
      input$button1 
    })

  observeEvent(my_reactive_expr(),{
    print("reactive value change detected!")
  })

  observeEvent(input$button1,{
    my_reactive_expr <<- reactive({
      input$button1
    })
  })

}

shinyApp(ui = ui, server = server)

像这样你可以避免覆盖反应功能。

以上是关于改变反应表达,保持观察者的主要内容,如果未能解决你的问题,请参考以下文章

如何通过反应上下文保持价值?

Rxswift 改变观察对象的值

深入理解观察者模式

设计模式——5.观察者模式

观察者模式

观察者模式(监护)