У меня есть общий вопрос о том, когда пользователи вносят изменения в значение ввода в Shiny и как эффективно реагировать на это изменение.
Сначала я нарисую картинку словами, затем попытаюсь создать минимальную версию того, о чем я говорю, с помощью кода.
Действие: Пользователь меняет раскрывающееся меню для выбора определенного элемента.
Реакция: Функция фильтра, основанная на этом пользовательском вводе, применяется к выходной переменной и отображается на экране.
Проблема: Я хочу применить этот фильтр для всех моих выходных значений на дисплее (без необходимости повторного вызова этой функции фильтра).
В настоящее время я вызываю ту же функцию с моими фильтрами, что и аргументы этой функции для каждой из моих output переменных. Это кажется пустой тратой вычислений, потому что мне действительно нужно вызывать функцию только один раз, использовать ВСЕ эти данные, чтобы заполнить все мои выходные значения.
Я чувствую, что здесь упускаю что-то фундаментальное.
В идеале я хотел бы иметь возможность вызывать что-то вроде этого (возвращает список, содержащий тиббл и некоторые другие вычисленные значения):
test <- reactive({se_report_filtered(my_filter = input$PM_ID,
start_year = input$obs[1],
end_year = input$obs[2])})
se_report_filtered - это функция, которая фактически вычисляет новые значения для меня и возвращает список.
Затем используйте test , чтобы заполнить все остальные выходные значения. Я не могу заставить это работать. Вместо этого я вызываю se_report_filtered для каждого из моих выходов. Это кажется неправильным подходом.
Это не полностью воспроизводимый фрагмент, но я надеюсь, что идея все еще встречается.
library(shiny)
library(shinydashboard)
header <- dashboardHeader(title = "Home")
frow1 <- fluidRow(
valueBoxOutput("value2"),
)
body <- dashboardBody(frow1)
#completing the ui part with dashboardPage
ui <- dashboardPage(title = 'Review', header, sidebar, body, skin='red')
server <- function(input, output) {
output$value2 <- renderValueBox({
valueBox(
formatC(se_report_filtered(my_filter = input$PM_ID,
start_year = input$obs[1],
end_year = input$obs[2])[[2]],
format="d", big.mark=',')
,'Total Met'
,icon = icon("stats",lib='glyphicon')
,color = "green")
})
}
shinyApp(ui, server)
Итак, по сути, я хочу заменить:
output$value2 <- renderValueBox({
valueBox(
formatC(se_report_filtered(my_filter = input$PM_ID,
start_year = input$obs[1],
end_year = input$obs[2])[[2]],
format="d", big.mark=',')
,'Total Met'
,icon = icon("stats",lib='glyphicon')
,color = "green")
})
с
output$value2 <- renderValueBox({
valueBox(
formatC(test[[2]],
format="d", big.mark=',')
,'Total Met'
,icon = icon("stats",lib='glyphicon')
,color = "green")
})
Я полагаю, что упускаю что-то фундаментальное, когда речь заходит о работе с реактивными переменными.