在 Shiny 中同步 Dygraph 和 DateRangeInput
Synchronise Dygraph and DateRangeInput in Shiny
我想在 Shiny App 中同步一个 dygraph 和一个 DateRangeInput。
下面的代码工作正常:我可以同时使用缩放选项和日期范围但我不能使用 dyRangeSelector 因为 "ping pong" 效果:
library(xts)
library(shiny)
library(dygraphs)
library(lubridate)
data("co2")
data <- as.vector(coredata(as.xts(co2)))
serie <- xts(x = data,order.by = seq(from=today(),by=1,length.out = length(data)))
ui <- fluidPage(
titlePanel("Dygraph & date range input"),
sidebarLayout(
sidebarPanel(
dateRangeInput('plage', label = "Selectionnez la période :",
start = start(serie), end = end(serie),
# min = start(serie), max = end(serie),
separator = " - ",
format = "dd mm yyyy", #"yyyy-mm-dd",
language = 'fr', weekstart = 1
)
),
mainPanel(
dygraphOutput("dessin")
)
)
)
server <- function(input, output,session) {
observeEvent(input$dessin_date_window,{
start <- as.Date(ymd_hms(input$dessin_date_window[[1]]))
stop <- as.Date(ymd_hms(input$dessin_date_window[[2]]))
updateDateRangeInput(session = session,
inputId = "plage",
start = start,end = stop
)
})
output$dessin <- renderDygraph({
dygraph(serie) %>%
dyRangeSelector(
dateWindow = input$plage+1) # +1 parce que voila...
})
}
# Run the application
shinyApp(ui = ui, server = server)
知道如何控制它吗?
(dygraph 没有更新功能...:( )
您可以在 dyRangeSelector()
中使用 retainDateWindow = TRUE
。
output$dessin <- renderDygraph({
dygraph(serie) %>%
dyRangeSelector(
dateWindow = input$plage+1, retainDateWindow = TRUE)
})
希望对您有所帮助。
只需为当前系列添加一个反应,你就可以了
current_series <- reactive({
range <- paste(input$plage[1], input$plage[2], sep = "/")
serie[range]
})
output$dessin <- renderDygraph({
dygraph(current_series()) %>%
dyRangeSelector(
dateWindow = input$plage+1) # +1 parce que voila...
})
您可以定义值来检查更改是由用户触发的还是由反应触发的。这使您可以控制连锁反应。
因为 dygraph 是一个输出,我需要添加一个中间值,只有在自动反应不触发时才会改变。因此,如果我们与之交互,或者如果由日期选择器触发,则 dygraph 会更新。但不是当日期选择器由 dygraph 上的更改触发时。
library(xts)
library(shiny)
library(dygraphs)
library(lubridate)
data("co2")
data <- as.vector(coredata(as.xts(co2)))
serie <- xts(x = data,order.by = seq(from=today(),by=1,length.out = length(data)))
ui <- fluidPage(
titlePanel("Dygraph & date range input"),
sidebarLayout(
sidebarPanel(
dateRangeInput('plage', label = "Selectionnez la période :",
start = start(serie), end = end(serie),
separator = " - ",
format = "dd mm yyyy", #"yyyy-mm-dd",
language = 'fr', weekstart = 1
)
),
mainPanel(
dygraphOutput("dessin")
)
)
)
server <- function(input, output,session) {
r <- reactiveValues(
change_datewindow = 0,
change_plage = 0,
change_datewindow_auto = 0,
change_plage_auto = 0,
plage = c( start(serie), end(serie))
)
observeEvent(input$dessin_date_window, {
message(crayon::blue("observeEvent_input_dessin_date_window"))
r$change_datewindow <- r$change_datewindow + 1
if (r$change_datewindow > r$change_datewindow_auto) {
r$change_plage_auto <- r$change_plage_auto + 1
r$change_datewindow_auto <- r$change_datewindow
start <- as.Date(ymd_hms(input$dessin_date_window[[1]]))
stop <- as.Date(ymd_hms(input$dessin_date_window[[2]]))
updateDateRangeInput(session = session,
inputId = "plage",
start = start,end = stop
)
} else {
if (r$change_datewindow >= 10) {
r$change_datewindow_auto <- r$change_datewindow <- 0
}
}
})
observeEvent(input$plage, {
message("observeEvent_input_plage")
r$change_plage <- r$change_plage + 1
if (r$change_plage > r$change_plage_auto) {
message("event input_year update")
r$change_datewindow_auto <- r$change_datewindow_auto + 1
r$change_plage_auto <- r$change_plage
r$plage <- input$plage
} else {
if (r$change_plage >= 10) {
r$change_plage_auto <- r$change_plage <- 0
}
}
})
output$dessin <- renderDygraph({
message("renderDygraph")
dygraph(serie) %>%
dyRangeSelector(
dateWindow = r$plage + 1) # +1 parce que voila...
})
}
# Run the application
shinyApp(ui = ui, server = server)
请注意,我在超过 10 时添加了计数器的重置。这避免了 R 的触发值过高。当计数器重置时,您可能会注意到一个小的爆发,具体取决于您的用户的速度改变滑块。您可以增加此值以减少它出现的频率。
我添加了一些消息,以便您验证是否没有连锁反应。
我想在 Shiny App 中同步一个 dygraph 和一个 DateRangeInput。 下面的代码工作正常:我可以同时使用缩放选项和日期范围但我不能使用 dyRangeSelector 因为 "ping pong" 效果:
library(xts)
library(shiny)
library(dygraphs)
library(lubridate)
data("co2")
data <- as.vector(coredata(as.xts(co2)))
serie <- xts(x = data,order.by = seq(from=today(),by=1,length.out = length(data)))
ui <- fluidPage(
titlePanel("Dygraph & date range input"),
sidebarLayout(
sidebarPanel(
dateRangeInput('plage', label = "Selectionnez la période :",
start = start(serie), end = end(serie),
# min = start(serie), max = end(serie),
separator = " - ",
format = "dd mm yyyy", #"yyyy-mm-dd",
language = 'fr', weekstart = 1
)
),
mainPanel(
dygraphOutput("dessin")
)
)
)
server <- function(input, output,session) {
observeEvent(input$dessin_date_window,{
start <- as.Date(ymd_hms(input$dessin_date_window[[1]]))
stop <- as.Date(ymd_hms(input$dessin_date_window[[2]]))
updateDateRangeInput(session = session,
inputId = "plage",
start = start,end = stop
)
})
output$dessin <- renderDygraph({
dygraph(serie) %>%
dyRangeSelector(
dateWindow = input$plage+1) # +1 parce que voila...
})
}
# Run the application
shinyApp(ui = ui, server = server)
知道如何控制它吗? (dygraph 没有更新功能...:( )
您可以在 dyRangeSelector()
中使用 retainDateWindow = TRUE
。
output$dessin <- renderDygraph({
dygraph(serie) %>%
dyRangeSelector(
dateWindow = input$plage+1, retainDateWindow = TRUE)
})
希望对您有所帮助。
只需为当前系列添加一个反应,你就可以了
current_series <- reactive({
range <- paste(input$plage[1], input$plage[2], sep = "/")
serie[range]
})
output$dessin <- renderDygraph({
dygraph(current_series()) %>%
dyRangeSelector(
dateWindow = input$plage+1) # +1 parce que voila...
})
您可以定义值来检查更改是由用户触发的还是由反应触发的。这使您可以控制连锁反应。
因为 dygraph 是一个输出,我需要添加一个中间值,只有在自动反应不触发时才会改变。因此,如果我们与之交互,或者如果由日期选择器触发,则 dygraph 会更新。但不是当日期选择器由 dygraph 上的更改触发时。
library(xts)
library(shiny)
library(dygraphs)
library(lubridate)
data("co2")
data <- as.vector(coredata(as.xts(co2)))
serie <- xts(x = data,order.by = seq(from=today(),by=1,length.out = length(data)))
ui <- fluidPage(
titlePanel("Dygraph & date range input"),
sidebarLayout(
sidebarPanel(
dateRangeInput('plage', label = "Selectionnez la période :",
start = start(serie), end = end(serie),
separator = " - ",
format = "dd mm yyyy", #"yyyy-mm-dd",
language = 'fr', weekstart = 1
)
),
mainPanel(
dygraphOutput("dessin")
)
)
)
server <- function(input, output,session) {
r <- reactiveValues(
change_datewindow = 0,
change_plage = 0,
change_datewindow_auto = 0,
change_plage_auto = 0,
plage = c( start(serie), end(serie))
)
observeEvent(input$dessin_date_window, {
message(crayon::blue("observeEvent_input_dessin_date_window"))
r$change_datewindow <- r$change_datewindow + 1
if (r$change_datewindow > r$change_datewindow_auto) {
r$change_plage_auto <- r$change_plage_auto + 1
r$change_datewindow_auto <- r$change_datewindow
start <- as.Date(ymd_hms(input$dessin_date_window[[1]]))
stop <- as.Date(ymd_hms(input$dessin_date_window[[2]]))
updateDateRangeInput(session = session,
inputId = "plage",
start = start,end = stop
)
} else {
if (r$change_datewindow >= 10) {
r$change_datewindow_auto <- r$change_datewindow <- 0
}
}
})
observeEvent(input$plage, {
message("observeEvent_input_plage")
r$change_plage <- r$change_plage + 1
if (r$change_plage > r$change_plage_auto) {
message("event input_year update")
r$change_datewindow_auto <- r$change_datewindow_auto + 1
r$change_plage_auto <- r$change_plage
r$plage <- input$plage
} else {
if (r$change_plage >= 10) {
r$change_plage_auto <- r$change_plage <- 0
}
}
})
output$dessin <- renderDygraph({
message("renderDygraph")
dygraph(serie) %>%
dyRangeSelector(
dateWindow = r$plage + 1) # +1 parce que voila...
})
}
# Run the application
shinyApp(ui = ui, server = server)
请注意,我在超过 10 时添加了计数器的重置。这避免了 R 的触发值过高。当计数器重置时,您可能会注意到一个小的爆发,具体取决于您的用户的速度改变滑块。您可以增加此值以减少它出现的频率。
我添加了一些消息,以便您验证是否没有连锁反应。