我一直在寻找在R Shiny应用程序中更新绘图的方法,而无需重新渲染整个绘图。我正在处理通过Slider Input
(animationOptions(playButton = TRUE)
)设置动画的时态数据。我们的想法是以某种方式突出显示通过Slider Input
选择的情节部分。在每个动画步骤重新渲染整个绘图会使整个应用程序无用地变慢。
ggplot2
最优雅的解决方案是,如果闪亮提供了一种向ggplot添加图层的方法(例如+ geom line()
),并将该图层无缝地集成到图中而无需重新渲染。可悲的是,this does not seem to work。一点点破解可能包括创建第二个ggplot
- 具有完全相同的x / y维度并重叠两个图的实例。
修改
我刚刚了解到有更多面向javascript的绘图方法而不是ggplot2
。例如,使用dygraphs
并添加dyShading
图层,可以很好地突出显示所选区域。但基本问题仍然相同,因为更改dyShading()
的起始值和结束值似乎需要重新渲染整个图。
library(shiny)
library(dygraphs)
library(xts)
data <- data.frame(
datetime = as.POSIXct("2016-06-20 17:00:00", tz = "UTC") + 1:100*60,
y = rnorm(100)
)
data_xts <- as.xts(data[,-1], data[,1])
minDatetime <- min(data$datetime)
maxDatetime <- max(data$datetime)
minY = min(data$y)
maxY = max(data$y)
plotlimits <- lims(x = c(minDatetime, maxDatetime), y = c(minY, maxY))
ui <- fluidPage(
sliderInput("timeslider", "Time Slider",
min = minDatetime,
max = maxDatetime,
value = c(minDatetime, minDatetime+10*60),
animate = animationOptions(interval=200)
),
dygraphOutput("dyplot")
)
server <- function(input, output) {
data_fil <- reactive({
data[data$datetime <= input$timeslider[2] & data$datetime >= input$timeslider[1],]
})
output$dyplot <- renderDygraph({
dygraph(data_xts) %>%
dyShading(
from = as.character(input$timeslider[1]),
to = as.character(input$timeslider[2]),
color = "tomato")
})
}
shinyApp(ui = ui, server = server)