【问题标题】:Is it possible to make an observeEvent for the start date and end date separately for dateRangeInput?是否可以分别为 dateRangeInput 的开始日期和结束日期创建一个 observeEvent?
【发布时间】:2021-09-20 04:10:55
【问题描述】:

我一直在使用 R Shiny,但遇到了一些问题。我想为日期范围输入创建一个用户流,其中:

  1. 如果用户在结束日期之后输入开始日期,结束日期会自动跟随并模仿开始日期。

  2. 如果用户在开始日期之前输入结束日期,开始日期会自动跟随并模仿结束日期。

我曾想过尝试使用observeEvent() 来作为单独的输入,如下所示:

#inputId of dateRangeInput = dateRange

#start date
observeEvent(input$dateRange[1], {
   - logic - 
})

#end date
observeEvent(input$dateRange[2], {
   - logic - 
})

以上所有操作都是运行两个观察事件,无论我是否更改了开始日期或结束日期的输入,所以我知道我的逻辑或对函数的理解在这里可能存在缺陷。

有没有办法做类似于我想要完成的事情,或者我应该尝试不同的方法?

提前感谢您的宝贵时间!

【问题讨论】:

  • 如果您可以提供更完整的reproducible example 以明确您的 UI 是什么样子以及您希望在服务器上发生什么行为,这将有所帮助。响应式“事物”是input$dateRange,当该输入的值发生变化时,整个向量都会更新,而不仅仅是向量中的一个元素。
  • 我认为您需要做的是将当前值保存在 reactiveVal 中,然后检查 input$dateRange 何时更改以查看两端中的哪一个已更改,并仅对那些做出反应.它既不直接也不优雅,但可以做到。
  • 您能否提供问题所需的uiserver 代码,以便完全重现问题以及必要时的必要数据?
  • 另外请注意,滑块的value 需要在更新期间始终有效。否则会出现NULL。我的回答here 可能是相关的。 @r2evans 已确定主要问题及其解决方案。

标签: r shiny shiny-reactivity golem


【解决方案1】:

感谢大家踊跃参与。我现在意识到我本可以提出一个更好、可重复的示例来帮助你们更好地了解我的问题,对此我深表歉意——我会在以后的帖子中记住这一点(向@MrFlick 大声疾呼以获取指向关于制作的帖子!)

我最终考虑了@r2evans 的评论,并以此为基础提出了解决方案!我对 Stackoverflow 还很陌生,所以不确定是否可以将评论标记为答案,但非常感谢@r2evans!

以下是我在服务器功能中使用的解决方案,以帮助我获得所需的功能:

curr_date <- shiny::reactiveValues(start=format(Sys.Date(),"%Y-%m-%d"), end=format(Sys.Date(), "%Y-%m-%d"))
  
shiny::observeEvent(input$reports_date_range, {
    
    dates <- input$reports_date_range
    
    # if start date changed 
    if (dates[1] != curr_date$start) {
      
      # if start date is after end date, have end date follow and update curr_date
      if(dates[1] > curr_date$end) {
        updateDateRangeInput(session, "reports_date_range", start = dates[1], end = dates[1])
        curr_date$start <- dates[1]
        curr_date$end <- dates[1]
      } else { # if start date is equal to or before end date, update curr_date$start
        curr_date$start <- dates[1]
      }
      
    } else if (dates[2] != curr_date$end) { # if end date changed
      
        # if end date is before start date, have start date follow end date
        if(dates[2] < curr_date$start) {
          updateDateRangeInput(session, "reports_date_range", start = dates[2], end = dates[2])
          curr_date$start <- dates[2]
          curr_date$end <- dates[2]
        } else { # if end date is equal to or after the start date, update curr_date$end
          curr_date$end <- dates[2]
        }
      
    }
  })

基本上,curr_date 中的反应值保存输入在开始时默认设置的当前日期,并在每次更改输入时更新为输入。

在服务器逻辑中,我检查用户输入的日期与我在curr_date 中输入的历史值是否不匹配,以确定两个日期(开始或结束)中的哪一个是由用户更改。然后,根据用户的操作应用正确的代码就很简单了!

再次感谢大家,如果你们有什么可以改进这个解决方案的地方,请告诉我,如果有任何发现我会更新!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2018-10-16
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多