理解Shiny中的反应函数

Jam*_*mes 6 r rstudio shiny

我创建了一个Shiny应用程序,它从数据库中提取数据.我在UI部分有许多输入,在服务器部分有许多输出.

在服务器部分,我有一个反应函数,它使用一些输入构建查询,然后从数据库中提取数据,例如:

queriedData <- reactive({
                query <- paste0(...,input$a,...);
                return(db$find(query))
               })
Run Code Online (Sandbox Code Playgroud)

在输出槽中,我指的是使用中的数据

x <- queriedData()
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  • 我相信只有当被动功能中引用的输入发生变化时,才会轮询数据库.它是否正确?
  • 因此,我认为调用此反应函数不会产生查询 - 即数据是否被缓存并提供缓存数据?
  • 对于不属于查询的输入,我假设对这些输入的更改不会导致新的数据库查询.它是否正确?

Jor*_*eys 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())
Run Code Online (Sandbox Code Playgroud)

现在 的更改input$a将使 无效query,从而触发其重新计算。query,一个反应式表达式,将使 无效queriedData(),触发其重新计算。这将使 无效output$thedata,并因此导致该部分被重新计算,从而导致数据表中显示新数据。