簡體   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