r-仅在用户选择按钮时渲染绘图



我有一个稍微详细的绘图,允许用户几乎完全控制所显示的内容,包括使用哪个数据库、x和y轴是什么、分面以及基于多个因素级别过滤数据。一切都很好。

现在的问题是,每次用户对任何选项进行更改时,都会重新绘制绘图。由于数据相当大,每次更改后都需要相当长的时间来重新绘制绘图。由于用户可能希望快速连续地进行一系列更改,这非常令人讨厌。例如,我有一个选择,默认显示15个可能级别中的10个。如果用户只想显示其中一个级别,他们将删除其他9个级别。这意味着情节重新绘制了10次,而我们只关心最后一次。

我想做的是允许用户进行他们想要的任意多的选择,但只有当他们点击"更新"按钮时才能重新绘制绘图。我试过实现这个,但我无法实现。我知道在observeEvent中包装情节是一种糟糕的做法,但我尝试过,但它不起作用,因为任何输入$都会迫使它更新。如果我只包装数据过滤,那么数据将被正确过滤(用str((测试(,但不会在绘图中实际更新。此外,这不允许用户更改轴。

如何创建一个可自定义的绘图,只有当用户这么说时才会更新?

编辑:作为我所能管理的可复制代码的基础,它显示了问题:

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)

我知道observeEvent不是它应该在的地方,但无论我把它放在哪里,只要用户选择任何更改,就会重新绘制图。我希望它只在按下更新按钮时更新。

使用isolate:的解决方案

server <- function(input, output) {
scatterplot <- reactive({
input[["updateButton"]]
gg <- 
ggplot() +
geom_point (
mapping = aes (
x = switch (
isolate(input$userXAxis),
"manufacturer" = mpg$manufacturer,
"year" = mpg$year,
"class" = mpg$class
),
y = switch (
isolate(input$userYAxis),
"displ" = mpg$displ,
"cyl" = mpg$cyl,
"cty" = mpg$cty,
"hwy" = mpg$hwy
)
)
) +
labs (
x = isolate(input$userXAxis),
y = isolate(input$userYAxis)
)
gg
})
output[["graph1"]] <- renderPlot({
scatterplot()
})
}
shinyApp(ui = ui, server = server)

最新更新