Как изменить формат на 24 часа в таблицах данных в R Shiny - PullRequest
1 голос
/ 29 июня 2019

Как и большинство людей, формат даты и времени не является моей любимой темой в R и снова доставляет мне больше хлопот, чем я рассчитывал.

В продолжение этого вопроса: SO

Я избавился от 'T' и 'Z' с помощью 'toLocaleString', но теперь мой datatableпоказывать время в AM и PM, а я просто хочу посмотреть оригинал 24 часа.

Я запускаю приложение в Google Chrome, и мой вывод выглядит следующим образом:

enter image description here

  library(shiny)
  library(DT)

  data <- structure(list(DATUM = structure(c(1490738402, 1490738436, 1490738440, 
                                             1490738444, 1490738447, 1490738451, 1490738455, 1490738459, 1490738463, 
                                             1490738467), class = c("POSIXct", "POSIXt"), tzone = "CEST"), NUMMER = c(19, 
                                                                                                                      20, 21, 22, 23, 24, 25, 26, 27, 28)), .Names = c("DATUM", "NUMMER"), row.names = c(NA, 10L), class = "data.frame")

  tz <- Sys.timezone()                                                                                                    
  data$DATUM <- as.POSIXct(as.character(data$DATUM), tz=tz)

  ui=fluidPage(

    dataTableOutput("tab")
  )

  server= function(input, output,session) {

    output$tab <- DT::renderDataTable({
      datatable(data,rownames=TRUE, filter="top", class = 'cell-border stripe') %>%
        formatDate(1, method = 'toLocaleString')})


  }

  shinyApp(ui, server)

1 Ответ

1 голос
/ 29 июня 2019

Можно попробовать изменить аргумент method в DT::formatDate на другой формат даты и времени, отметьте ?DT::formatDate или Функции помощника DT .Если ни один из этих методов не дает правильного вывода, вы можете вручную отформатировать вывод даты и времени с помощью format, например,

data$DATUM <- format(data$DATUM, "%d/%m/%Y, %H:%M:%S")
#>  [1] "28/03/2017, 22:00:02" "28/03/2017, 22:00:36" "28/03/2017, 22:00:40"
#>  [4] "28/03/2017, 22:00:44" "28/03/2017, 22:00:47" "28/03/2017, 22:00:51"
#>  [7] "28/03/2017, 22:00:55" "28/03/2017, 22:00:59" "28/03/2017, 22:01:03"
#> [10] "28/03/2017, 22:01:07"

Если вы не хотите изменять значения POSIXct в исходных данных.кадр, вы можете обновить формат даты и времени только внутри функции рендеринга.Ниже приведен только один способ сделать это с помощью dplyr:

library(shiny)
library(DT)
library(dplyr)

data <- structure(list(DATUM = structure(c(1490738402, 1490738436, 1490738440, 
                                           1490738444, 1490738447, 1490738451, 1490738455, 1490738459, 1490738463, 
                                           1490738467), class = c("POSIXct", "POSIXt"), tzone = "CEST"), NUMMER = c(19, 
                                                                                                                    20, 21, 22, 23, 24, 25, 26, 27, 28)), .Names = c("DATUM", "NUMMER"), row.names = c(NA, 10L), class = "data.frame")

tz <- Sys.timezone()                                                                                                    
data$DATUM <- as.POSIXct(as.character(data$DATUM), tz=tz)

ui=fluidPage(

  dataTableOutput("tab")
)

server= function(input, output,session) {

  output$tab <- DT::renderDataTable({

    mutate(data, DATUM = format(DATUM, "%d/%m/%Y, %H:%M:%S")) %>%
    datatable(rownames=TRUE, filter="top", class = 'cell-border stripe')

    })


}

shinyApp(ui, server)

Обратите внимание, что в вашем конкретном примере, если даты не обязательно должны быть классом POSIXct, может быть достаточно просто проанализировать даты какстроки напрямую:

data <- structure(list(DATUM = structure(c(1490738402, 1490738436, 1490738440, 
                                           1490738444, 1490738447, 1490738451, 1490738455, 1490738459, 1490738463, 
                                           1490738467), class = c("POSIXct", "POSIXt"), tzone = "CEST"), NUMMER = c(19, 
                                                                                                                    20, 21, 22, 23, 24, 25, 26, 27, 28)), .Names = c("DATUM", "NUMMER"), row.names = c(NA, 10L), class = "data.frame")

(data$DATUM <- as.character(data$DATUM))
#>  [1] "2017-03-28 22:00:02" "2017-03-28 22:00:36" "2017-03-28 22:00:40"
#>  [4] "2017-03-28 22:00:44" "2017-03-28 22:00:47" "2017-03-28 22:00:51"
#>  [7] "2017-03-28 22:00:55" "2017-03-28 22:00:59" "2017-03-28 22:01:03"
#> [10] "2017-03-28 22:01:07"
...