繁体   English   中英

反应式编程 shiny 应用程序中的观察者概念

[英]observer concept in the reactive programming shiny app

我想知道是否有人可以以最简单的方式解释以下关于观察者的概念(取自此处)。? 为什么每次 x 改变打印的次数都会增加?

在此处输入图像描述

x <- reactiveVal(1)
y <- observe({
  x()
  observe(print(x()))
})

#> [1] 1
x(2)
#> [1] 2
#> [1] 2
x(3)
#> [1] 3
#> [1] 3
#> [1] 3

正如我所说,我很难比最后一句更好地解释。 每次x()更改时,都会创建一个的嵌套观察者。 第一个执行print(x) ,第二个也执行,等等。每个都打印x的值。

下面的代码显示最后有三个嵌套的观察者,但还有另一个困难,即理解local()

library(shiny)
reactiveConsole(TRUE)

x <- reactiveVal(1)
i <- 0
observe({
  x()
  i <<- i + 1
  local({
    j <- i
    observe({
      x()
      print(paste("Hello I am the nested observer", j))
    })
  })
})
# [1] "Hello I am the nested observer 1"
# > x(12)
# [1] "Hello I am the nested observer 1"
# [1] "Hello I am the nested observer 2"
# > x(16)
# [1] "Hello I am the nested observer 1"
# [1] "Hello I am the nested observer 2"
# [1] "Hello I am the nested observer 3"

也考虑一下这个:

x <- reactiveVal(1)
observe({
  x()
  local({
    y <- x()
    observe({
      x()
      print(y)
    })
  })
})
# [1] 1
# > x(5)
# [1] 1
# [1] 5
# > x(9)
# [1] 1
# [1] 5
# [1] 9

这个另一个例子也很有启发性:

x <- reactiveVal(10)
observe({
  x()
  observe({
    req(x() >= 3)
    print(x())
  })
})
# [1] 10
# > x(2) # a new nested observer is created but it doesn't react because 2 < 3
# > x(1) # a new nested observer is created but it doesn't react because 1 < 3
# > x(4) # a new nested observer is created and it reacts because 4 >= 3
# [1] 4
# [1] 4
# [1] 4
# [1] 4

我不喜欢这个例子,因为它紧随其后:

作为一般规则,您应该只在服务器 function 的顶层创建观察者或输出。 如果您发现自己试图将它们嵌套或在 output 中创建观察者,请坐下来画出您正在尝试创建的反应图 - 几乎可以肯定有更好的方法。

也就是说,重点是无论是否分配或分配了什么,都会创建观察者。 每次x更改时, y内部的语句都会再次运行。 该语句创建了一个打印 x 的新的唯一观察者。 它不会覆盖先前创建的观察者。 通过更改x 3 次,您创建了 3 个独特的打印观察者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM