R 闪亮过滤器将用户提供的日期与数据集日期重叠

R 闪亮过滤器将用户提供的日期与数据集日期重叠,r,shiny,lubridate,R,Shiny,Lubridate,我有一个简单的任务,我无法解决。如果两个日期之间的时间间隔与用户选择的时间间隔重叠,我将尝试在数据帧中过滤日期(在此之后)。本质上,我试图实现以下两个部分的功能-第一部分将1。过滤数据并2。同时告诉用户在屏幕上某个单独区域的间隔之间ID的计数: library(dplyr) library(shiny) library(lubridate) df <- data.frame(date1 = seq.Date(from =as.Date("1997-01-01"),

我有一个简单的任务,我无法解决。如果两个日期之间的时间间隔与用户选择的时间间隔重叠,我将尝试在数据帧中过滤日期(在此之后)。本质上,我试图实现以下两个部分的功能-第一部分将1。过滤数据并2。同时告诉用户在屏幕上某个单独区域的间隔之间ID的
计数

library(dplyr)
library(shiny)
library(lubridate)

df <- data.frame(date1 = seq.Date(from =as.Date("1997-01-01"), 
                                  to=as.Date("1997-01-07"), by="day"),
                 date2 = seq.Date(from =as.Date("1997-01-03"), 
                                  to=as.Date("1997-01-09"), by="day"),
                 id = c(rep("a", 3), rep("b",4)))
df
       date1      date2 id
1 1997-01-01 1997-01-03  a
2 1997-01-02 1997-01-04  a
3 1997-01-03 1997-01-05  a
4 1997-01-04 1997-01-06  b
5 1997-01-05 1997-01-07  b
6 1997-01-06 1997-01-08  b
7 1997-01-07 1997-01-09  b

欢迎提出任何修改(和改进)代码的建议。另外,我想知道这是否是查找重叠日期的最佳方法,因为它只在70000行上运行很慢。

您第二次调用
interval
是错误的。
input$dateRange[1]
后面的括号应该在
input$dateRange[2]
后面。照原样,
input$dateRange[2]
被理解为
int\u overlaps
的一个(未命名)参数,这就是为什么会出现这个错误。啊,新鲜的眼睛,我想还有更多,谢谢!
my_interval <- function(date_from, date_to) {
  df2 <- df %>%
    mutate(tmp_interval = as.integer(int_overlaps(interval(date1, date2), 
                                                  interval(as.Date(date_from), as.Date(date_to))))) %>%
    filter(tmp_interval == 1) %>%
    distinct(id) %>%
    ungroup() 
  x <- c("The number of IDs between ", date_from, " and ", date_to, " was ", tally(df2))
  return(paste(x, collapse = ""))
}
my_interval("1997-01-03", "1997-01-05")
#"The number of IDs between 1997-01-03 and 1997-01-05 was 2"
ui <- fluidPage(
  titlePanel("test"),

  column(4, wellPanel(
    dateRangeInput('dateRange',
                   label = 'Filter overlapping dates',
                   start = as.Date('1997-01-01') , end = as.Date('1997-03-01')
    )
  )),
  column(6,
         dataTableOutput('my_table')
  )
)

server <- function(input, output, session) {
  output$my_table  <- renderDataTable({
    df %>%
      mutate(tmp_interval = as.integer(int_overlaps(interval(date1, date2), 
                                                    interval(input$dateRange[1]), input$dateRange[2]))) %>%
      filter(tmp_interval == 1)
  })
}

shinyApp(ui = ui, server = server)