是否可以为 dateRangeInput 分别为开始日期和结束日期制作一个 observeEvent?
Is it possible to make an observeEvent for the start date and end date separately for dateRangeInput?
我一直在使用 R Shiny,但遇到了一些问题。我想为日期范围输入创建一个用户流,其中:
如果用户在结束日期之后输入开始日期,结束日期将自动跟随并模仿开始日期。
如果用户在开始日期之前输入结束日期,开始日期将自动跟随并模仿结束日期。
我想尝试使用 observeEvent()
作为单独的输入,如下所示:
#inputId of dateRangeInput = dateRange
#start date
observeEvent(input$dateRange[1], {
- logic -
})
#end date
observeEvent(input$dateRange[2], {
- logic -
})
以上所做的只是运行无论我是否更改了开始日期或结束日期的输入,都观察事件,所以我知道我的逻辑或对功能的理解可能存在缺陷。
有没有一种方法可以完成与我试图完成的事情类似的事情,或者我应该尝试不同的方法?
提前感谢您的宝贵时间!
感谢大家的参与。我现在意识到我本可以提出一个更好的、可重现的例子来帮助你们更好地了解我的问题,对此我深表歉意——我会在以后的 post 中牢记这一点(向@MrFlick 大声疾呼)为了伟大的 link 到 post 关于制作一个!)
我最终考虑了@r2evans 的评论,并基于它提出了一个解决方案!我是 Whosebug 的新手,所以不确定我是否可以将评论标记为答案,但非常感谢@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
中输入的历史值之间是否存在不匹配,以确定这两个日期中的哪一个(开始或结束)被用户更改。然后,根据用户的操作应用正确的代码就是一件简单的事情!
再次感谢大家,让我知道你们是否可以发现任何改进此解决方案的方法,如果有任何发现,我会更新!
我一直在使用 R Shiny,但遇到了一些问题。我想为日期范围输入创建一个用户流,其中:
如果用户在结束日期之后输入开始日期,结束日期将自动跟随并模仿开始日期。
如果用户在开始日期之前输入结束日期,开始日期将自动跟随并模仿结束日期。
我想尝试使用 observeEvent()
作为单独的输入,如下所示:
#inputId of dateRangeInput = dateRange
#start date
observeEvent(input$dateRange[1], {
- logic -
})
#end date
observeEvent(input$dateRange[2], {
- logic -
})
以上所做的只是运行无论我是否更改了开始日期或结束日期的输入,都观察事件,所以我知道我的逻辑或对功能的理解可能存在缺陷。
有没有一种方法可以完成与我试图完成的事情类似的事情,或者我应该尝试不同的方法?
提前感谢您的宝贵时间!
感谢大家的参与。我现在意识到我本可以提出一个更好的、可重现的例子来帮助你们更好地了解我的问题,对此我深表歉意——我会在以后的 post 中牢记这一点(向@MrFlick 大声疾呼)为了伟大的 link 到 post 关于制作一个!)
我最终考虑了@r2evans 的评论,并基于它提出了一个解决方案!我是 Whosebug 的新手,所以不确定我是否可以将评论标记为答案,但非常感谢@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
中输入的历史值之间是否存在不匹配,以确定这两个日期中的哪一个(开始或结束)被用户更改。然后,根据用户的操作应用正确的代码就是一件简单的事情!
再次感谢大家,让我知道你们是否可以发现任何改进此解决方案的方法,如果有任何发现,我会更新!