【问题标题】:Understanding reactive functions in Shiny了解 Shiny 中的反应函数
【发布时间】:2017-02-03 02:42:12
【问题描述】:

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

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

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

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

x <- queriedData()

我的问题是:

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

【问题讨论】:

  • 相信您的理解是正确的。一种测试方法是在你的函数中加入一些print() 语句,看看什么时候触发。
  • 我认为第一点有点不同,当它依赖的输入发生变化时,反应值会失效,但是当说一些使用反应的输出需要更新时,它会被重新评估。观察员按照您的第一点工作。

标签: r shiny rstudio


【解决方案1】:

回答您的问题:

  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 无效,并因此导致该部分被重新计算,从而导致数据表中显示新数据。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2021-11-29
    • 2019-12-17
    • 2015-05-10
    • 2018-06-23
    • 2014-09-06
    相关资源
    最近更新 更多