2016-09-25 62 views
5

我創建了一個Shiny應用程序,它從數據庫中提取數據。我在UI部分有很多輸入,在服務器部分有很多輸出。瞭解Shiny中的響應函數

在服務器部分我有使用一些輸入建立一個查詢,然後在數據提取從一個數據庫中的反應性官能團,例如:

queriedData <- reactive({ 
       query <- paste0(...,input$a,...); 
       return(db$find(query)) 
       }) 

在輸出插槽,我指的是數據使用

x <- queriedData() 

我的問題是:

  • 我相信,只有當輸入的是重新對數據庫進行輪詢傾向於反應性功能的變化。它是否正確?
  • 因此,我是否認爲調用這個被動函數不會產生查詢 - 即數據是否被緩存並提供了緩存數據?
  • 對於不屬於查詢的輸入,我假定對這些輸入進行的更改不會導致新的數據庫查詢。它是否正確?
+1

我相信你的理解是正確的。測試的一種方法是在你的函數中加入一些'print()'語句來查看什麼時候被觸發。 – SymbolixAU

+0

我認爲第一點有點不同,當輸入依賴於變化時,被動值將失效,但當說出一些使用被動需求更新的輸出時,它將被重新評估。觀察員按照你的第一點工作。 –

回答

2

回答您的問題:

  1. 事實上,任何反應的表達,只有當它依賴於它的反應的表現之一是更新重新驗證。只要反應式表達式的值改變爲所有其他依賴於它的反應式表達式,Shiny就會傳遞一個無效標誌。下次使用這些無效的反應表達式時,它們將被重新計算。因此,在您的情況下,queriedData(這是一個反應性表達式)將被無效,因此每次收到input$a的無效標誌時都會更新。由於數據庫查詢是該計算的一部分,因此您的假設是正確的。
  2. 這取決於。當input$a沒有改變,因此queriedData沒有失效,它只是返回緩存的數據。當input$a確實改變時,queriedData被重新計算,因此會產生一個查詢。
  3. 由於只有被動表達式可以傳遞一個無效標誌,這些是唯一可以導致重新計算另一個被動表達式的表達式。如果其他部分沒有反應,他們也不能無效,因此不能導致重新計算queriedData

請記住,反應式表達式不一定需要是輸入。以下面的例子:

query <- reactive({paste0(...,input$a,...)}) 
queriedData <- reactive({ 
       db$find(query()) 
       }) 
output$thedata <- renderDataTable(queriedData()) 

現在input$a的變化將無效query,觸發其重新計算。 query是一個反應式表達式,將使queriedData()無效,從而觸發其重新計算。這將使output$thedata無效,並因此也導致該部分被重新計算,導致數據表中顯示新數據。