У меня есть довольно подробный график, который позволяет пользователю практически полностью контролировать то, что отображается, в том числе какую базу данных использовать, каковы оси x и y, фасетирование и фильтрацию данных на основе нескольких уровней факторов. Все это прекрасно работает.
Проблема в том, что сейчас, каждый раз, когда пользователь вносит изменения в ЛЮБОЙ из параметров, график перерисовывается. Поскольку данные достаточно велики, перерисовка графика после каждого изменения занимает заметное время. Поскольку пользователь может захотеть внести кучу изменений в быстрой последовательности, это довольно раздражает. Например, у меня есть один выбор, который по умолчанию показывает 10 из 15 возможных уровней. Если пользователь хочет показать только один из этих уровней, он удалит другой 9. Это означает, что сюжет перерисовывает aws сам по себе 10 раз, когда все, что нам нужно, это последний.
Что я Хотелось бы сделать, это позволить пользователю сделать столько выборов, сколько он хочет, но перерисовать график только тогда, когда он нажмет кнопку «обновить». Я пытался реализовать это, но я не могу заставить его работать. Я знаю, что завершение графика в наблюдаемом событии - плохая практика, но я попробовал его, и он не работает, так как любой ввод $ заставляет его обновляться в любом случае. Если я оберну только фильтрацию данных, эти данные будут отфильтрованы правильно (протестировано с помощью str ()), но на самом деле никогда не обновятся в графике. Кроме того, это не позволяет пользователю изменять ось.
Как создать настраиваемый график, который обновляется только тогда, когда пользователь говорит об этом?
РЕДАКТИРОВАТЬ: как основу c воспроизводимых код, которым я могу управлять, который показывает проблему:
library(shiny)
library(tidyverse)
ui <- sidebarLayout (
sidebarPanel (
selectizeInput (
inputId= "userXAxis",
label= "X Axis",
choices= colnames(mpg[c(1,4,11)]),
selected= "year"
),
selectizeInput (
inputId= "userYAxis",
label= "Y Axis",
choices= colnames(mpg[c(3,5,8,9)]),
selected= "cty"
),
actionButton(
inputId = "updateButton",
label = "Update"
)
),
mainPanel (
plotOutput("graph1")
)
)
server <- function(input, output) {
observeEvent(input$updateButton,
output$graph1 <- renderPlot({
ggplot() +
geom_point (
mapping = aes (
x = switch (
input$userXAxis,
"manufacturer" = mpg$manufacturer,
"year" = mpg$year,
"class" = mpg$class
),
y = switch (
input$userYAxis,
"displ" = mpg$displ,
"cyl" = mpg$cyl,
"cty" = mpg$cty,
"hwy" = mpg$hwy
)
)
) +
labs (
x = input$userXAxis,
y = input$userYAxis
)
})
)
}
shinyApp(ui = ui, server = server)
Я знаю, что наблюдаемое событие не там, где оно должно быть, но независимо от того, где я его поместил, график будет краснее aws всякий раз, когда пользователь выбирает любое изменение , Я хочу, чтобы он обновлялся только при нажатии кнопки обновления.