如何在 R Shiny 的数据表中更改为 24 小时格式
How to change to 24 hour format in datatables in R Shiny
就像大多数人一样,时间日期格式也不是我在 R 中最喜欢的主题,并且再次给我带来了比我预想的更多的麻烦。
在这个问题的后续:SO
我用 'toLocaleString'
摆脱了 'T' 和 'Z' 但现在我的 datatable
显示的是上午和下午的时间,而我只想查看原来的24小时。
我是 运行 google chrome 中的应用程序,目前我的输出如下所示:
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)
您可以尝试将 DT::formatDate
中的 method
参数更改为不同的 date-time 格式,检查 ?DT::formatDate
或 DT Helper Functions。如果这些方法中的 none 给出了正确的输出,您可以使用 format
手动格式化 date-time 输出,例如
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"
如果你不想改变原来data.frame中的POSIXct-values,你可以只更新render-function里面的date-time格式。下面只是使用 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 class,直接将日期解析为字符串可能就足够了:
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"
就像大多数人一样,时间日期格式也不是我在 R 中最喜欢的主题,并且再次给我带来了比我预想的更多的麻烦。
在这个问题的后续:SO
我用 'toLocaleString'
摆脱了 'T' 和 'Z' 但现在我的 datatable
显示的是上午和下午的时间,而我只想查看原来的24小时。
我是 运行 google chrome 中的应用程序,目前我的输出如下所示:
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)
您可以尝试将 DT::formatDate
中的 method
参数更改为不同的 date-time 格式,检查 ?DT::formatDate
或 DT Helper Functions。如果这些方法中的 none 给出了正确的输出,您可以使用 format
手动格式化 date-time 输出,例如
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"
如果你不想改变原来data.frame中的POSIXct-values,你可以只更新render-function里面的date-time格式。下面只是使用 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 class,直接将日期解析为字符串可能就足够了:
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"