【问题标题】:Pass a dynamic Date Date Range to dateRangeInput in R Shiny将动态日期日期范围传递给 R Shiny 中的 dateRangeInput
【发布时间】:2018-07-15 23:35:26
【问题描述】:

我刚开始使用 Shiny 并使用它来显示选定站点的风频输出(速度和方向)。

问题

每个数据集都有不同的日期范围,当用户选择不同的站点时,我似乎无法将这些可变日期范围返回到 UI 中的 dateRangeInput。

如果选择的日期超出所选数据集范围,Shiny 会出错并在各处显示红色文本。为了解决这个问题,我使用最小/最大范围来输入 dataRangeInput。

到目前为止我的代码示例

用户从 UI 'selectInput' 的下拉菜单中选择一个站点,这会创建变量 input/ID“df”。

我可以让任何事情发挥作用的唯一方法是使用特定数据集的日期范围将日期范围作为全局变量传递,但这实际上是一个手动过程:

创建一些示例数据(在实际数据中,日期为日期/时间格式):

library(shiny)
library(openair)
library(ggplot2)

date<- c("2017-01-01","2017-01-02","2017-01-03","2017-01-04")
ws<-c(rep(0:3,1))
SiteA <- data.frame(date,ws,stringsAsFactors = FALSE)

date<- c("2017-01-01","2017-01-02","2017-01-03","2017-01-04","2017-01-05", "2017-01-06")
ws<-c(rep(0:5,1))
SiteB <- data.frame(date,ws,stringsAsFactors = FALSE)

从数据中提取最小值和最大值(这是我需要帮助的地方):

# Date ranges currently fixed to SiteA (need this to be dynamic based on selection)   
mystartdate <- as.character(format(as.Date(min(SiteA$date))),"yyyy-mm-dd")
myenddate <- as.character(format(as.Date(max(SiteA$date))),"yyyy-mm-dd")

然后将这些日期传递到 UI 中的日期范围:

ui <- fluidPage(
    titlePanel("title"),

    sidebarLayout(
            sidebarPanel(
                    selectInput("df","Choose a Site:",
                                choices = c(
                                        "Site A" = 'SiteA',
                                        "Site B" = 'SiteB')
                    ),           

                    dateRangeInput("date", "Select the date range:",
                                   start = mystartdate, # Start date of the selected df
                                   end = myenddate, # End date of the selected df
                                   min = mystartdate,
                                   max = myenddate,
                                   format = "yyyy-mm-dd")
            ),
            mainPanel(
                    strong(paste("Frequency Distribution:")),
                    plotOutput("hist")
            )       
    )
)

然后将日期范围作为输入传递以过滤图 input$date[1] 和 input$date[2]。

server <- function(input, output) {

    df <- reactive({
            x <- get(input$df)
    })

    output$hist <- renderPlot({
            df <- df() # df is the user selected dataset
            dfhist<- selectByDate(df, start = input$date[1], end = input$date[2])
            ggplot(df, aes(df$ws)) +
                    geom_histogram(fill = "blue", bins = 50) +
                    labs(x="Wind Speed (m/s)", y="Count")

    })
}               

shinyApp(ui = ui, server = server)

我的问题:

如何从所选数据集(SiteA 或 SiteB)中提取最小/最大日期并将其返回到 dateRangeInput 单元格?

任何想法/指针将不胜感激。谢谢

【问题讨论】:

  • 执行代码很复杂,因为它不是可重现的示例。 SiteA$date的对象怎么样?
  • 请检查此链接,为帮助您,我需要您的SiteA 对象how to make a reproducible example 的至少一个示例
  • 谢谢,我添加了一些示例数据。为混乱道歉。不想让代码太长。但希望这会有所帮助。
  • 好的。我会发布答案

标签: r shiny


【解决方案1】:

我从选定的数据集(SiteA 或 SiteB)中提取最小/最大数据并将它们返回到 dateRangeInput 单元格。我根据 dataRangeInput 上选择的日期在数据框中制作了子集以显示绘图。我相信这满足您的所有应用程序。

library(shiny)
library(openair)
library(ggplot2)
library(readr)


ui <- fluidPage(
  titlePanel("title"),

  sidebarLayout(
    sidebarPanel(
      selectInput("df","Choose a Site:",
                  choices = c(
                    "Site A" = 'SiteA',
                    "Site B" = 'SiteB')
      ),
       uiOutput("dateRange")


    ),
    mainPanel(
      strong(paste("Frequency Distribution:")),
      plotOutput("hist")
    )       
  )
)

server <- function(input, output, session) {
  df <- reactive({
    if(input$df == "SiteA"){
      date<- c("2017-01-01","2017-01-02","2017-01-03","2017-01-04")
      ws<-c(rep(0:3,1))
      SiteA <- data.frame(date,ws,stringsAsFactors = FALSE)
      x <- SiteA
    }
    if(input$df == "SiteB"){
      date<- c("2017-01-01","2017-01-02","2017-01-03",
                "2017-01-04","2017-01-05", "2017-01-06")
      ws<-c(rep(0:5,1))
      SiteB <- data.frame(date,ws,stringsAsFactors = FALSE)
      x <- SiteB
   }
      return(x)
  })



  output$dateRange <- renderUI({
    dateRangeInput("date", "Select the date range:",
                   start = 
    as.character(format(as.Date(min(df()$date))),"yyyy-mm-dd"), # Start 
                        end = 
    as.character(format(as.Date(max(df()$date))),"yyyy-mm-dd"), # End 
               min = 
    as.character(format(as.Date(min(df()$date))),"yyyy-mm-dd"),
               max = 
    as.character(format(as.Date(max(df()$date))),"yyyy-mm-dd"),
               format = "yyyy-mm-dd")

  })



  output$hist <- renderPlot({
    df <- df() # df is the user selected dataset
    dfhist<- subset(df, date >= as.Date(input$date[1]) & date <= 
                     as.Date(input$date[2]) )
    ggplot(dfhist, aes(dfhist$ws)) +
      geom_histogram(fill = "blue", bins = 50) +
      labs(x="Wind Speed (m/s)", y="Count")

  })


}

shinyApp(ui=ui, server = server)

【讨论】:

  • 感谢@WiniciusSabino,您的解决方案完美运行。还要感谢对分布图的子集添加。接下来我正要解决这个问题!
  • 不客气。任何问题,我随时为您服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多