返回SelectInput匹配当前日期

时间:2015-10-18 20:40:47

标签: r date match shiny

我希望根据评估sys.Date()与具有一系列日期的数据框来解决在下拉列表(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 个答案:

答案 0 :(得分: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()))
})