了解 Shiny 中的反应函数
Understanding reactive functions in Shiny
我创建了一个 Shiny 应用程序,它可以从数据库中提取数据。我在 UI 部分有一些输入,在服务器部分有一些输出。
在服务器部分,我有一个反应函数,它使用一些输入构建查询,然后从数据库中提取数据,例如:
queriedData <- reactive({
query <- paste0(...,input$a,...);
return(db$find(query))
})
在输出槽中,我参考了using中的数据
x <- queriedData()
我的问题是:
- 我相信只有当反应函数中引用的输入发生变化时才会轮询数据库。这是正确的吗?
- 因此,我认为调用此反应函数不会产生查询是否正确 - 即缓存数据并提供缓存数据?
- 对于不属于查询的输入,我假设对这些输入的更改不会导致新的数据库查询。这是正确的吗?
回答您的问题:
- 事实上,任何反应式表达式只有在它所依赖的反应式表达式之一更新时才会重新生效。 Shiny 这样做是为了在反应式表达式的值更改为依赖于它的所有其他反应式表达式时传递一个无效标志。下次使用这些无效的反应表达式时,将重新计算它们。因此,在您的情况下,
queriedData
(这是一个反应式表达式)将失效,因此每次从 input$a
收到无效标志时都会更新。由于数据库查询是该计算的一部分,因此您的假设是正确的。
- 这取决于。当
input$a
没有改变并且因此 queriedData
没有失效时,它只是 returns 缓存的数据。然而,当 input$a
确实发生变化时,queriedData
会重新计算,因此会产生一个查询。
- 由于只有反应式表达式可以传递无效标志,因此只有这些才能真正导致另一个反应式表达式被重新计算。如果其他部分不是反应性的,它们也不会失效,因此不会导致重新计算
queriedData
.
请记住,反应式表达式不一定是输入。举个例子:
query <- reactive({paste0(...,input$a,...)})
queriedData <- reactive({
db$find(query())
})
output$thedata <- renderDataTable(queriedData())
现在 input$a
中的更改将使 query
无效,从而触发其重新计算。 query
,一个反应式表达式,将使 queriedData()
无效,触发其重新计算。这将使 output$thedata
无效,并因此导致重新计算该部分,从而导致数据 table.
中显示的新数据
我创建了一个 Shiny 应用程序,它可以从数据库中提取数据。我在 UI 部分有一些输入,在服务器部分有一些输出。
在服务器部分,我有一个反应函数,它使用一些输入构建查询,然后从数据库中提取数据,例如:
queriedData <- reactive({
query <- paste0(...,input$a,...);
return(db$find(query))
})
在输出槽中,我参考了using中的数据
x <- queriedData()
我的问题是:
- 我相信只有当反应函数中引用的输入发生变化时才会轮询数据库。这是正确的吗?
- 因此,我认为调用此反应函数不会产生查询是否正确 - 即缓存数据并提供缓存数据?
- 对于不属于查询的输入,我假设对这些输入的更改不会导致新的数据库查询。这是正确的吗?
回答您的问题:
- 事实上,任何反应式表达式只有在它所依赖的反应式表达式之一更新时才会重新生效。 Shiny 这样做是为了在反应式表达式的值更改为依赖于它的所有其他反应式表达式时传递一个无效标志。下次使用这些无效的反应表达式时,将重新计算它们。因此,在您的情况下,
queriedData
(这是一个反应式表达式)将失效,因此每次从input$a
收到无效标志时都会更新。由于数据库查询是该计算的一部分,因此您的假设是正确的。 - 这取决于。当
input$a
没有改变并且因此queriedData
没有失效时,它只是 returns 缓存的数据。然而,当input$a
确实发生变化时,queriedData
会重新计算,因此会产生一个查询。 - 由于只有反应式表达式可以传递无效标志,因此只有这些才能真正导致另一个反应式表达式被重新计算。如果其他部分不是反应性的,它们也不会失效,因此不会导致重新计算
queriedData
.
请记住,反应式表达式不一定是输入。举个例子:
query <- reactive({paste0(...,input$a,...)})
queriedData <- reactive({
db$find(query())
})
output$thedata <- renderDataTable(queriedData())
现在 input$a
中的更改将使 query
无效,从而触发其重新计算。 query
,一个反应式表达式,将使 queriedData()
无效,触发其重新计算。这将使 output$thedata
无效,并因此导致重新计算该部分,从而导致数据 table.