如何在 R-Shiny 中连接 dateRangeInput 和 sliderInput

先驱报

在我的 Shiny-app 中,我必须按时间对数据帧进行子集化。对我来说最方便的小部件是滑块输入,但我也希望允许从日历中选择特定日期的可能性,就像我使用 dateRangeInput 所做的那样,因为数据集跨越多年的日常数据。我试图链接它们两个,当 dateRange 更改时更新滑块,反之亦然使用两个单独的 renderUI()。通常,这很有效,但在某些情况下,我会陷入无限循环,滑块和 rangeInput 不断相互无效。无限循环仅在通过滑块更改后触发。

到目前为止,我的方法如下所示:

  output$dateRangeSliderUI <- renderUI({
    date_range_input <- input$dateRangeInput
    data <- isolate(dataset())
    start_date <- default_start
    end_date <- default_end
    
    if (is.null(date_range_input)){
      range_slider <- c(start_date, end_date)
    } else {
      range_slider <- date_range_input
    }
    
    sliderInput("dateRangeSlider",
                label = "Date Range:",
                value = range_slider,
                min = min(data$Date),
                max = max(data$Date),
                step = 1,
                timeFormat = "%F")
  })
  
  output$dateRangeInputUI <- renderUI({  
    date_range_slider <- input$dateRangeSlider
    data <- isolate(dataset$regressions)
    start_date <- default_start
    end_date <- default_end
    
    if (is.null(date_range_slider)){
      range_input <- c(start_date, end_date)
    } else {
      range_input <- date_range_slider
    }
    
    dateRangeInput("dateRangeInput",
                   label = NULL,
                   start = range_input[1],
                   end = range_input[2],
                   min = min(data$Date),
                   max = max(data$Date))
  })
 

如您所见,这两个小部件仅对彼此的更改做出反应,并且 start_date 和 end_date 说明了启动期间的错误,在此期间它们仍然为 NULL。

你能帮我吗,我怎样才能避免陷入无限循环?

瓦尔迪

为了避免递归可以使用两种reactiveVal存储的最后更新时间sliderInputdateRange
更新仅在一定延迟后完成,以确保这是手动的:

library(shiny)

ui <- fluidPage(
  sliderInput(
    "slider",
    "Slider",
    min = Sys.Date() - 90,
    max = Sys.Date(),
    value =  c(Sys.Date() - 30, Sys.Date())
  ),
  dateRangeInput(
    "daterange",
    "Input date range",
    start = Sys.Date() - 30,
    end = Sys.Date()
  )
)

server <- function(input, output, session) {
  ## Avoid chain reaction
  reactdelay <- 1
  change_slider <- reactiveVal(Sys.time())
  change_daterange <- reactiveVal(Sys.time())
  
  
  observeEvent(input$slider, {
    if (difftime(Sys.time(), change_slider()) > reactdelay) {
      change_daterange(Sys.time())
      updateDateRangeInput(session,
                           "daterange",
                           start = input$slider[[1]],
                           end = input$slider[[2]])
    }
  })
  observeEvent(input$daterange, {
    if (difftime(Sys.time(), change_daterange()) > reactdelay) {
      change_slider(Sys.time())
      updateSliderInput(session,
                        "slider",
                        value = c(input$daterange[[1]], input$daterange[[2]]))
    }
  })
}

shinyApp(ui, server)

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Shiny中同步Dygraph和DateRangeInput

R Shiny - 如何使用函数 dateRangeInput 和 selectInput 创建反应式条形图

dateRangeInput R Shiny 控件对齐

如何使用R / Shiny更改dateRangeInput的样式/显示?

在R Shiny daterangeinput中更改日期格式

在Shiny的dateRangeInput中更改“ to”的语言

在R Shiny中的渲染UI中创建分类的SliderInput

R Shiny中的sliderInput有问题-获取NaNs

在Shiny中隐藏sliderInput的值

如何在更改第二个sliderInput时重置一个sliderInput而不触发Shiny中的反应

R Shiny:使用dateRangeInput验证(need())

如何在 R Shiny 和 plotly 中处理大量数据?

R Shiny Suppress滑块的sliderInput直到单击

将动态日期日期范围传递给R Shiny中的dateRangeInput

反应性更新Shiny中的sliderInput

在Shiny演练中更改SliderInput的颜色

如果我手动更改R Shiny中的第一个dateRangeInput,则无法更新第二个dateRangeInput

R [Shiny]:实现对 dateRangeInput 有反应的值框的问题

在R Shiny中使用sliderInput动态渲染Choropleth贴图

如何在R Shiny仪表板中打开和关闭行

如何在Shiny R Dashboard的Navbar中读取和显示时间

如何在R Shiny应用程序中对齐downloadButton和ActionButton?

如何在R Shiny中对齐图像?

如何在R Shiny中查询元素

如何在R Shiny中同步地图

有没有办法根据 R Shiny 中选定的 tabPanel 更新 tabsetPanel 中的 sliderInput 的输入?

仅在将fileInput加载到Shiny中时显示sliderInput

在Shiny中为sliderInput定义值的特定范围

在Shiny应用程序中定义sliderInput函数