Xiang
Xiang

Reputation: 1

Take the last date range input in R Shiny

[I'm trying to quote the app user for multiple date range inputs. However, the number of date range inputs could be different every time. For example, this time I have 3 periods and next time I may have 17 periods to grab. How should I code the endDate to have R grab the last date range input automatically?]

1

ui <-fluidPage(   
  dateRangeInput('dateRange1', label = 'period1', start = '', end = ''  ),  
  dateRangeInput('dateRange2', label = 'period2', start = '', end = ''  ),  
  dateRangeInput('dateRange3', label = 'period3', start = '', end = ''  ),  
  dateRangeInput('dateRange4', label = 'period4', start = '', end = ''  ),  
  dateRangeInput('dateRange5', label = 'period5', start = '', end = ''  ),  
  dateRangeInput('dateRange6', label = 'period6', start = '', end = ''  ),  
  dateRangeInput('dateRange7', label = 'period7', start = '', end = ''  ),  
  dateRangeInput('dateRange8', label = 'period8', start = '', end = ''  ),  
  dateRangeInput('dateRange9', label = 'period9', start = '', end = ''  ),  
  dateRangeInput('dateRange10', label = 'period10', start = '', end = ''  ),  
  dateRangeInput('dateRange11', label = 'period11', start = '', end = ''  ),  
  dateRangeInput('dateRange12', label = 'period12', start = '', end = ''  ),  
  dateRangeInput('dateRange13', label = 'period13', start = '', end = ''  ),  
  dateRangeInput('dateRange14', label = 'period14', start = '', end = ''  ),  
  dateRangeInput('dateRange15', label = 'period15', start = '', end = ''  ),  
  dateRangeInput('dateRange16', label = 'period16', start = '', end = ''  ),  
  dateRangeInput('dateRange17', label = 'period17', start = '', end = ''  ),  
  dateRangeInput('dateRange18', label = 'period18', start = '', end = ''  ),  
  dateRangeInput('dateRange19', label = 'period19', start = '', end = ''  ),  
  dateRangeInput('dateRange20', label = 'period20', start = '', end = ''  ),
  actionButton("submit", "Submit")
)

server <- function(input, output, session) {
  observeEvent(input$submit, {
    startDate = input$dateRange1[1]   
    endDate = ???
  })
}

Upvotes: 0

Views: 366

Answers (2)

Pierre L
Pierre L

Reputation: 28441

To save typing energy we can use a wrapper function when it makes sense.

dateRanger <- function(range, label, start, end) {
  lst1 <- Map(dateRangeInput, range, label=label, start=start, end=end)
  c(lst1, list(actionButton('submit', "Submit")))
}

dr <- dateRanger(paste0("dateRange", 1:20),
                 paste0("period", 1:20), '', '')
f2 <- do.call('fluidPage', unname(dr))

all.equal(f1, f2)
#[1] TRUE

Upvotes: 1

Ben Fasoli
Ben Fasoli

Reputation: 526

You could get a list of all of the dateRangeXX inputs using

dateRanges <- grep('dateRange', names(input), value = T)

You would then extract the minimum and maximum values by converting the dateRange inputs into a matrix of dates and calculating the start and end dates.

dateMatrix <- sapply(dateRanges, function(x) {input[[x]]})
dateMin <- min(dateMatrix[ ,1], na.rm = T)
dateMax <- max(dateMatrix[ ,2], na.rm = T)

Upvotes: 0

Related Questions