将带有时区对象的日期时间传递给闪亮仪表板中的日期范围输入

Pass datetime with time-zone objects to date-range input in shiny dashboard

我下面有一个闪亮的仪表板,其中有一个 dateRange() 输入,我想在其中传递带时区的日期时间。但是,当我在将日期时间对象转换为因子后尝试将它们转换为日期时,我得到 NAs。我该如何继续?

require(lubridate)
require(dplyr)

df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"),
                localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)

df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")

df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))

df

df$localtime <- factor(df$localtime)

df$localtime<- as.Date(df$localtime, format = "%Y/%m/%d")

## app.R ##
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    dateRangeInput('dateRange',
                   label = 'Date range input: yyyy-mm-dd',
                   start = df$localtime - 2, end = df$localtime + 2
    )
  ),
  dashboardBody()
)

server <- function(input, output) {


}

shinyApp(ui, server)

您不想将日期对象转换为因数。我删除了 factor() 行并且它工作正常。另外,我想您希望用户选择时区的位置,因为您的数据框中有两个项目,但 startend 只接受一个。我添加了一个位置选择器。

require(lubridate)
require(dplyr)

df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"),
                localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)

df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")

df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))

df$localtime = as.Date(df$localtime, format = "%Y/%m/%d")

df
## app.R ##
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
    dashboardHeader(),
    dashboardSidebar(
        selectInput(inputId = "choosezone", label = "Choose your location",choices = c("LA", "NY")),
        uiOutput("selectdate") 
    ),
    dashboardBody()
)

server <- function(input, output) {
    output$selectdate = renderUI({
        location_choice = ifelse(input$choosezone == "LA", 1, 2)
            dateRangeInput('dateRange',
                           label = 'Date range input: yyyy-mm-dd',
                           start = df$localtime[location_choice] - 2, end = df$localtime[location_choice] + 2
            )
    })

}

shinyApp(ui, server)

R 中的因素可能很棘手。您不能像处理日期那样处理它们,例如,您不能对它们进行加减法运算。

我已经让您的代码正常工作,但除非您对使用因子有特定要求,否则我建议您避免使用它们。

require(lubridate)
require(dplyr)

df = data.frame(timestring = c("2015-12-12 13:34:56", "2015-12-14 16:23:32"),
                localzone = c("America/Los_Angeles", "America/New_York"), stringsAsFactors = F)

df$moment = as.POSIXct(df$timestring, format="%Y-%m-%d %H:%M:%S", tz="UTC")

df = df %>% rowwise() %>% mutate(localtime = force_tz(moment, localzone))

df

df$localtime <- factor(df$localtime)

df$localtime<- as.Date(as.Date(df$localtime), format = "%Y/%m/%d")

## app.R ##
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(
    dateRangeInput('dateRange',
                   label = 'Date range input: yyyy-mm-dd',
                   start = df$localtime[1] - 2, end = df$localtime[1] + 2
    )
  ),
  dashboardBody()
)

server <- function(input, output) {


}

shinyApp(ui = ui, server = server)

另一个问题是 df$localtime 中有两个日期,所以我更改了 dateRangeInput 以使用第一个日期。