2016-12-05 62 views
0

[我試圖引用應用程序用戶輸入多個日期範圍。但是,日期範圍輸入的數量可能每次都不相同。例如,這次我有3個時間段,下一次我可能有17個時間段來抓。我應該如何編寫代碼的結束日期,以具有R自動抓取的最後日期範圍輸入?]以R的最後日期範圍輸入Shiny

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 = ??? 
    }) 
} 

回答

0

你可以使用

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

你得到所有的dateRangeXX輸入列表然後通過將dateRange輸入轉換爲日期矩陣並計算開始日期和結束日期來提取最小值和最大值。

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

爲了節省輸入能量,我們可以在有意義時使用包裝函數。

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 
+0

我也喜歡你的答案,因爲你太棒了,你花時間去解決別人的問題。感謝 – nik

+1

非常感謝,但這是不必要的。 –