#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)