Передать дату и время с объектами часового пояса в диапазон дат на блестящей приборной панели - PullRequest
0 голосов
/ 15 марта 2020

У меня внизу блестящая приборная панель с входом 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)

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы не хотите конвертировать объект даты в фактор. Я удалил строку factor(), и она работала нормально. Кроме того, я предполагаю, что вы хотите, чтобы пользователь выбрал местоположение для часового пояса, поскольку в вашем фрейме данных есть два элемента, но start, end принимает только один. Я добавил селектор местоположения.

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)

1 голос
/ 17 марта 2020

Факторы в R могут быть хитрыми. Вы не можете работать с ними так же, как и с датами, например, вы не можете делать сложения и вычитания для них.

У меня работает ваш код, но если у вас нет заданного c требование использования факторов, я бы посоветовал их избегать.

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 для использования первой даты.

...