[英]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.