Есть ли какой-либо способ установить приоритет в реактивных функциях в Shiny?

#r #shiny

#r #блестящий

Вопрос:

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

     sumItemsValues <- reactive({
      actualData <- switch (input$sumTabs,
                            area = sumAreaValues(),
                            kg = sumKgValues(),
                            yield = sumYieldValues(),
                            profits = sumProfitsValues(),
                            price = sumPriceValues(),
                            profitability = sumProfitabilityValues()
      )
    })
    
    sumValues <- reactive({
        actualData <- switch (input$sumTabs,
                            area = areaSum(),
                            kg = kgSum(),
                            yield = yieldSum(),
                            profits = profitsSum(),
                            price = priceSum(),
                            profitability = profitabilitySum()
        )
    })
  

Между этими 2 функциями есть больше функций, и когда я запускаю приложение и переключаюсь между вкладками в течение короткого периода времени, я вижу ошибку, но она быстро исчезает. Ошибка заключается в том, что сначала он пытается выполнить вторую функцию, а вторая функция требует, чтобы была выполнена первая функция. Спасибо, что уделили вам время.

Ответ №1:

Вы могли бы использовать req во второй функции :

  sumItemsValues <- reactive({
      switch (input$sumTabs,
              area = sumAreaValues(),
              kg = sumKgValues(),
              yield = sumYieldValues(),
              profits = sumProfitsValues(),
              price = sumPriceValues(),
              profitability = sumProfitabilityValues()
      )
    })
    
    sumValues <- reactive({
        req(sumItemsValues())
        switch (input$sumTabs,
                area = areaSum(),
                kg = kgSum(),
                yield = yieldSum(),
                profits = profitsSum(),
                price = priceSum(),
                profitability = profitabilitySum()
        )
    })
  

Комментарии:

1. Разве это не должно быть req(sumItemsValues()) ? Кроме того, внутри reactive операторов зачем использовать присваивание actualData ?

2. @Valeri спасибо за ваш отзыв, я слишком поторопился с этим. Да, это req(sumItemsValues()) , и да, я скопировал исходное сообщение, но sumValues ничего не выводит только с присвоением. Я исправил сообщение.

3. Назначение @Waldi фактически возвращает вывод, просто молча. Вот почему x <- y <- 2 работает

4. @SmokeyShakers, не как вывод функции: попробуйте f <- function(){a <- 1}; f()

5. @Waldi Вы не правы. f() возвращает значение автоматически. После вашего кода попробуйте, x <- f() затем x в консоли

Ответ №2:

Вместо использования реактивных проводников ( reactive ) вы можете использовать реактивные значения и observeEvent , у которых есть priority опция:

 sumItemsValues <- reactiveVal(NULL)
sumValues <- reactiveVal(NULL)

observeEvent(input$sumTabs, {
  actualData <- switch(
    input$sumTabs,
    area = sumAreaValues(),
    kg = sumKgValues(),
    yield = sumYieldValues(),
    profits = sumProfitsValues(),
    price = sumPriceValues(),
    profitability = sumProfitabilityValues()
  )
  sumItemsValues(actualData)
}, priority = 2)

observeEvent(input$sumTabs, {
  actualData <- switch(
    input$sumTabs,
    area = areaSum(),
    kg = kgSum(),
    yield = yieldSum(),
    profits = profitsSum(),
    price = priceSum(),
    profitability = profitabilitySum()
  )
  sumValues(actualData)
}, priority = 1)