2015-10-18 61 views
1

我正在尋找解決問題的方法,該方法基於評估sys.Date()與具有一定範圍的日期的數據框在下拉列表(SelectInput)列表中顯示默認值。SelectInput匹配當前日期的默認值

DF1:

code date  group 
10001 2015-10-07 a 
10005 2015-10-11 b 
10022 2015-10-18 c 
10032 2015-10-23 d 
10044 2015-10-30 a 

第二DF創建評估今天的日期(恰巧的是2015年10月18日)

active.date=as.data.frame((Sys.Date())) 
names(active.date)[1]<-"date" 
active.date$date=as.Date(active.date$date) 

我敢肯定,有可能是一個稍微乾淨方式爲,但它的作品...

我知道這一點:

match(active.date$date,df1$date) 

將返回正確的一行其中有一場比賽,也許是我需要前往做到這一點...

在UI方面,我有:

selectInput("get.id",label="ID NUMBER", setNames(as.list(df1$code),df1$date)), 

actionButton("submit", "SUBMIT") 

第一值,在下拉列表中顯示只是從數據幀中的第一項:

2015-10-07 

我所希望實現的是從下拉列表中返回默認值是在有效日期(今天的例子) 當有一個匹配

2015-10-18 

,並從列表中返回的第一個項目時,有沒有比賽。我仍然希望返回下拉列表中的所有可能值(以便可以選擇所有日期),並且理想情況下,它會保持正確的日期順序以便它們發生。

回答

1

我會在應用程序加載時訂購數據。並相應地呈現選擇輸入。

library(shiny) 
shinyApp(
    shinyUI(
     fluidPage(
      uiOutput('getter'), 
      actionButton('submit', 'SUBMIT') 
     ) 
    ), 
    shinyServer(function(input, output, session) { 
     today <- Sys.Date() 
     dat <- reactive({ 
      ind <- match(today, as.Date(df1$date), FALSE) 
      if (ind) df1[c(ind, seq_len(nrow(df1))[-ind]), ] 
      else df1 
     }) 

     output$getter <- renderUI({ 
      selectInput('get.id', label="ID NUMBER", choices=as.character(dat()$date)) 
     }) 
    }) 
) 

或者,你可以保持的選擇作爲反應和使用

choices <- reactive({ 
    ind <- match(today, as.Date(df1$date), FALSE) 
    if (ind) df1$date[c(ind, seq_len(nrow(df1))[-ind])] 
    else df1$date 
}) 

output$getter <- renderUI({ 
    selectInput('get.id', label="ID NUMBER", choices=as.character(choices())) 
}) 
+0

這是偉大的謝謝!只要我明白髮生了什麼事情,在創建ind時,「FALSE」扮演的角色是什麼?然後,看起來我們正在設置一個新的df1,其中ind首先出現(第6行),然後將數據幀的其餘部分減去第6行? – wetcoaster

+0

是的,沒錯,'match'有一個默認值返回,所以FALSE告訴'match'在沒有匹配的時候返回FALSE(而不是默認的NA) – jenesaisquoi

+0

它在本地運行很好(日期是10月18日) ,但我想shinapps.io服務器位於與我不同的時區。你不會碰巧知道如何改變客戶的時區?嘗試將代碼調整爲.... today < - Sys.Date() - as.difftime(10,unit =「hours」),但是一旦上傳到shinyapps服務器似乎沒有什麼區別。 – wetcoaster