В этом блестящем приложении у меня есть график, который зависит от двух входных переменных: cases_deaths
и min_n
.
Когда изменяется cases_deaths
, min_n
настраивается автоматически:
min_n
= 10 для cases_deaths
= "смертей"
min_n
= 100 для cases_deaths
= "случаев"
Моя проблема заключается в том, что при изменении значения cases_deaths
, ggplot рисуется два раза.
Представьте, что я начинаю со значений по умолчанию cases_deaths
= "case" и min_n
= 100. Я переключаю cases_deaths
на "deaths". Происходит следующее:
- ggplot, нарисованный с
cases_deaths
= "deaths" и min_n
= 100 min_n
, изменен на 10 - ggplot draw с
cases_deaths
= "смерти" и min_n
= 10
Как можно избежать шага 1, чтобы ggplot рисовался только один раз?
Ниже полностью воспроизводимый пример.
library(dplyr)
library(ggplot2)
library(shiny)
cases_deaths = "cases"
DF = data.frame(
stringsAsFactors = FALSE,
country = c("Denmark","Denmark","Denmark","Denmark","US","US","US","US"),
time = c("2020-03-06","2020-03-07","2020-03-17","2020-03-18","2020-02-05","2020-02-06","2020-03-11","2020-03-12"),
cases_sum = c(24L, 24L, 1024L, 1115L, 11L, 11L, 1281L, 1663L),
deaths_sum = c(11L, 50L, 14L, 24L, 110L, 120L, 36L, 40L),
cases_diff = c(13L, 70L, 92L, 91L, 10L, 220L, 322L, 382L),
deaths_diff = c(11L, 20L, 31L, 40L, 110L, 220L, 118L, 24L)
)
ui <- function(request) {
fluidPage(
sidebarLayout(
sidebarPanel(width = 2,
radioButtons(inputId = "cases_deaths", label = " ", selected = "cases",
choices = c("cases", "deaths"), inline = TRUE),
# Dynamically change with cases_deaths
uiOutput('min_n2')),
mainPanel(plotOutput("distPlot", height = "700px", width = "100%"))
)
)
}
server <- function(input, output) {
# min_n changes depending on cases_deaths value
output$min_n2 = renderUI({
if (input$cases_deaths == "cases") {
sliderInput('min_n', paste0("# of cases"), min = 1, max = 200, value = 100)
} else {
sliderInput('min_n', paste0("# of deaths"), min = 1, max = 200, value = 10)
}
})
final_df = reactive({
dta = DF %>%
rename(value = paste0(input$cases_deaths, "_diff")) %>%
mutate(days_after_100 = 0:(length(country)-1))
# Slow down so the redrawing is more clear
Sys.sleep(.5)
req(input$min_n)
# Filter by min_n
dta %>% filter(value >= input$min_n)
})
# Show plot
output$distPlot <- renderPlot({
ggplot(data = final_df(), aes(x = days_after_100, y = value)) +
geom_point() +
theme_minimal(base_size = 14)
})
}
shinyApp(ui = ui, server = server)
Я видел Как предотвратить многократное перерисовывание блестящего графика при взаимодействии с пользовательским интерфейсом? * сообщение 1045 *, но я не уверен, как эта логика c применяется здесь.