理解Shiny中的反应函数

时间:2016-09-25 19:59:39

标签: r shiny rstudio

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

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

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

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

中的数据
x <- queriedData()

我的问题是:

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

1 个答案:

答案 0 :(得分:2)

回答你的问题:

  1. 实际上,任何反应式表达式只有在更新依赖于它的其中一个反应式表达式时才会重新生效。只要反应式表达式的值更改为依赖于它的所有其他反应式表达式,Shiny就会传递无效标志。下次使用这些无效的反应式表达式时,将重新计算它们。因此,在您的情况下,queriedData(这是一个反应式表达式)将无效,因此每次从input$a收到无效标志时都会更新。由于数据库查询是该计算的一部分,因此您的假设是正确的。
  2. 这取决于。如果input$a没有更改,因此queriedData未失效,则只会返回缓存的数据。但是,input$a确实发生了更改,queriedData会重新计算,因此会产生查询。
  3. 由于只有反应式表达式可以传递无效标志,因此这些只能实际导致重新计算另一个反应式表达式。如果其他部分不具有反应性,则它们也无效,因此无法重新计算queriedData
  4. 请记住,反应性表达并不一定需要作为输入。举几个例子:

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

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