R中shiny应用程序中timevis的日期-时间问题

yuvru6vn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(139)

我有一个闪亮的应用程序,我想使用甘特的timevis包:

  1. library(timevis)
  2. library(shiny)
  3. ui <- fluidPage(
  4. textAreaInput("addText", "Add item:", "service: \n Cost: "),
  5. dateInput("addDate", NULL, Sys.Date()),
  6. textAreaInput("group", "Add group:", "Owner:"),
  7. actionButton("addBtn", "Add"),
  8. timevisOutput("timelineInteractive"),
  9. tableOutput("table")
  10. )
  11. server <- function(input, output, session) {
  12. data_rv <- reactiveValues(data = data.frame(start = as.POSIXct(character(), tz = "UTC"),
  13. end = as.POSIXct(character(), tz = "UTC"),
  14. content = character(),
  15. group = character(),
  16. stringsAsFactors = FALSE),
  17. userUpdated = FALSE)
  18. groups <- reactive({
  19. if(nrow(data_rv$data) == 0) {
  20. NULL
  21. } else {
  22. data.frame(id = unique(data_rv$data$group),
  23. content = unique(data_rv$data$group))
  24. }
  25. })
  26. observeEvent(input$addBtn, {
  27. new_item <- data.frame(start = as.POSIXct(input$addDate, tz = "UTC"),
  28. end = NA,
  29. content = gsub("\n", "<br>", input$addText),
  30. group = input$group,
  31. stringsAsFactors = FALSE)
  32. data_rv$data <- rbind(data_rv$data, new_item)
  33. data_rv$userUpdated <- FALSE
  34. })
  35. output$timelineInteractive <- renderTimevis({
  36. config <- list(
  37. editable = TRUE,
  38. multiselect = TRUE
  39. )
  40. timevis(data = data_rv$data, groups = groups(), options = config)
  41. })
  42. observeEvent(input$timelineInteractive_data, {
  43. if (!data_rv$userUpdated) {
  44. timeline_data <- input$timelineInteractive_data
  45. timeline_data$start <- as.POSIXct(timeline_data$start, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC")
  46. if ("end" %in% names(timeline_data)) {
  47. timeline_data$end <- as.POSIXct(timeline_data$end, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC")
  48. } else {
  49. timeline_data$end <- NA
  50. }
  51. timeline_data <- timeline_data[ , c("start", "end", "content", "group")]
  52. names(timeline_data) <- c("start", "end", "content", "group")
  53. data_rv$userUpdated <- TRUE
  54. data_rv$data <- timeline_data
  55. } else {
  56. data_rv$userUpdated <- FALSE
  57. }
  58. })
  59. output$table <- renderTable({
  60. data <- input$timelineInteractive_data
  61. data
  62. })
  63. }
  64. shinyApp(ui = ui, server = server)

字符串
应用程序正在工作,但它没有得到正确的日期:(!无论我从dateInput中选择什么,都会在前一天的22:00:00出现在timevis和表上!而我不知道该怎么解决

esyap4oy

esyap4oy1#

原因很简单:同时,正如代码中所示,所有时间戳都以UTC表示,应用程序以本地时间显示它们。您可以通过转换所需时区中的startend值来解决此问题。下面应该可以使用lubridate::with_tztzone = Sys.timezone()

  1. library(timevis)
  2. library(shiny)
  3. ui <- fluidPage(
  4. textAreaInput("addText", "Add item:", "service: \n Cost: "),
  5. dateInput("addDate", NULL, Sys.Date()),
  6. textAreaInput("group", "Add group:", "Owner:"),
  7. actionButton("addBtn", "Add"),
  8. timevisOutput("timelineInteractive"),
  9. tableOutput("table")
  10. )
  11. server <- function(input, output, session) {
  12. data_rv <- reactiveValues(data = data.frame(start = as.POSIXct(character(), tz = "UTC"),
  13. end = as.POSIXct(character(), tz = "UTC"),
  14. content = character(),
  15. group = character(),
  16. stringsAsFactors = FALSE),
  17. userUpdated = FALSE)
  18. groups <- reactive({
  19. if(nrow(data_rv$data) == 0) {
  20. NULL
  21. } else {
  22. data.frame(id = unique(data_rv$data$group),
  23. content = unique(data_rv$data$group))
  24. }
  25. })
  26. observeEvent(input$addBtn, {
  27. new_item <- data.frame(start = lubridate::with_tz(as.POSIXct(input$addDate, tz = "UTC"), tzone = Sys.timezone()),
  28. end = NA,
  29. content = gsub("\n", "<br>", input$addText),
  30. group = input$group,
  31. stringsAsFactors = FALSE)
  32. data_rv$data <- rbind(data_rv$data, new_item)
  33. data_rv$userUpdated <- FALSE
  34. })
  35. output$timelineInteractive <- renderTimevis({
  36. config <- list(
  37. editable = TRUE,
  38. multiselect = TRUE
  39. )
  40. timevis(data = data_rv$data, groups = groups(), options = config,
  41. timezone = 0)
  42. })
  43. observeEvent(input$timelineInteractive_data, {
  44. if (!data_rv$userUpdated) {
  45. timeline_data <- input$timelineInteractive_data
  46. timeline_data$start <- lubridate::with_tz(as.POSIXct(timeline_data$start, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC"),
  47. tzone = Sys.timezone())
  48. if ("end" %in% names(timeline_data)) {
  49. timeline_data$end <- lubridate::with_tz(as.POSIXct(timeline_data$end, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC"),
  50. tzone = Sys.timezone())
  51. } else {
  52. timeline_data$end <- NA
  53. }
  54. timeline_data <- timeline_data[ , c("start", "end", "content", "group")]
  55. names(timeline_data) <- c("start", "end", "content", "group")
  56. data_rv$userUpdated <- TRUE
  57. data_rv$data <- timeline_data
  58. } else {
  59. data_rv$userUpdated <- FALSE
  60. }
  61. })
  62. output$table <- renderTable({
  63. data <- input$timelineInteractive_data
  64. data
  65. })
  66. }
  67. shinyApp(ui = ui, server = server)

字符串

展开查看全部

相关问题