我创建了一个Shiny应用程序,该应用程序从数据库中提取数据。我在UI部分有很多输入,在Server部分有很多输出。

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

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

在输出插槽中,我引用了使用中的数据
x <- queriedData()

我的问题是:
  • 我相信只有在响应式(Reactive)函数中引用的输入发生更改时,才对数据库进行轮询。这样对吗?
  • 因此,我是否正确地认为调用此 react 函数不会产生查询-即已缓存数据并提供了缓存的数据?
  • 对于不属于查询的输入,我假设对这些输入的更改不会引起新的数据库查询。这样对吗?
  • 最佳答案

    要回答您的问题:

  • 实际上,仅当更新任何依赖于它的 react 性表达式之一时,才会重新验证该 react 性表达式。每当响应式(Reactive)表达式的值更改为依赖它的所有其他响应式(Reactive)表达式时,Shiny都会这样做以传递无效标记。下次使用这些无效的响应式(Reactive)表达式时,将重新计算它们。因此,在您的情况下,queriedData(它是一个 react 性表达式)将无效,并因此在每次从input$a收到无效标志时进行更新。由于数据库查询是该计算的一部分,因此您的假设是正确的。
  • 取决于。当input$a不变,因此queriedData没有失效时,它仅返回缓存的数据。但是,当input$a确实发生更改时,会重新计算queriedData,因此将产生查询。
  • 因为只有反应式表达式可以传递无效标记,所以只有那些实际上可以导致重新计算另一个响应式(Reactive)表达式的表达式。如果其他部分没有反应性,则它们也不会失效,因此不会导致queriedData的重新计算。

  • 请记住,响应式(Reactive)表达式不一定需要作为输入。请看以下示例:
    query <- reactive({paste0(...,input$a,...)})
    queriedData <- reactive({
                    db$find(query())
                   })
    output$thedata <- renderDataTable(queriedData())
    

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

    关于r - 了解Shiny中的 react 函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39691240/

    10-12 19:11