2016-09-25 3 views
5

Я создал приложение Shiny, которое извлекает данные из базы данных. У меня есть несколько входов в части пользовательского интерфейса и несколько выходов в части сервера.Понимание реактивных функций в Shiny

В серверной части у меня есть реактивная функция, которая строит запрос, используя некоторые из входов, а затем тянет в данных из базы данных, например:

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

В выходных слотах, я отношусь к данным при помощи

x <- queriedData() 

Мои вопросы:

  • Я считаю, что база данных опрашивается только тогда, когда входы, которые повторно перешли на изменение реактивной функции. Это верно?
  • Как мне кажется, я правильно понимаю, что вызов этой реактивной функции не порождает запрос - то есть данные кэшируются и кэшируются данные?
  • Для входов, которые не являются частью запроса, я предполагаю, что изменения в них не вызывают новый запрос к базе данных. Это верно?
+1

Я считаю, что ваше понимание верное. Способ тестирования состоит в том, чтобы поместить некоторые операторы 'print()' в ваши функции, чтобы увидеть, что срабатывает, когда. – SymbolixAU

+0

Я думаю, что первый момент немного отличается, реактивное значение будет недействительным, когда входы зависят от изменений, но он будет переоценен, когда скажем, что некоторые выходы, которые используют реактивные потребности для обновления. Наблюдатели работают в соответствии с вашим первым пунктом. –

ответ

2

Чтобы ответить на ваши вопросы:

  1. Действительно, любое реактивное выражение только подтверждаться, когда один из реактивных выражений зависят от него обновляется. Shiny делает это, чтобы передать флаг invalidate всякий раз, когда значение реактивного выражения изменяется на все остальные реактивные выражения, которые зависят от него. В следующий раз, когда используются эти недействительные реактивные выражения, они пересчитываются. Таким образом, в вашем случае queriedData (который является реактивным выражением) будет признан недействительным и, следовательно, обновляется каждый раз, когда он получает флаг invalidate от input$a. Поскольку запрос базы данных является частью этого расчета, ваше предположение верно.
  2. Это зависит от ситуации. Когда input$a не изменился и, следовательно, queriedData не признан недействительным, он просто возвращает данные кэширования. Когда input$a действительно изменилось, queriedData пересчитывается и, следовательно, будет порождать запрос.
  3. Поскольку только реактивные выражения могут передавать флаг invalidate, это единственные, которые могут фактически вызывать повторное вычисление другого реактивного выражения. Если другие части не реагируют, они также не могут аннулировать и, следовательно, не могут вызывать пересчет queriedData.

Имейте в виду, что реактивное выражение необязательно должно быть входным. Возьмем следующий пример:

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

Теперь изменение input$a аннулирует query, вызывая ее перерасчет. query, реактивное выражение, аннулирует queriedData(), вызывая его пересчет. Это приведет к недействительности output$thedata и, следовательно, приведет к перерасчету этой части, что приведет к новым данным, указанным в таблице данных.

Смежные вопросы