Reputation: 1
[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?]
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
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
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