我有一个闪亮的应用程序,我想使用甘特的timevis
包:
library(timevis)
library(shiny)
ui <- fluidPage(
textAreaInput("addText", "Add item:", "service: \n Cost: "),
dateInput("addDate", NULL, Sys.Date()),
textAreaInput("group", "Add group:", "Owner:"),
actionButton("addBtn", "Add"),
timevisOutput("timelineInteractive"),
tableOutput("table")
)
server <- function(input, output, session) {
data_rv <- reactiveValues(data = data.frame(start = as.POSIXct(character(), tz = "UTC"),
end = as.POSIXct(character(), tz = "UTC"),
content = character(),
group = character(),
stringsAsFactors = FALSE),
userUpdated = FALSE)
groups <- reactive({
if(nrow(data_rv$data) == 0) {
NULL
} else {
data.frame(id = unique(data_rv$data$group),
content = unique(data_rv$data$group))
}
})
observeEvent(input$addBtn, {
new_item <- data.frame(start = as.POSIXct(input$addDate, tz = "UTC"),
end = NA,
content = gsub("\n", "<br>", input$addText),
group = input$group,
stringsAsFactors = FALSE)
data_rv$data <- rbind(data_rv$data, new_item)
data_rv$userUpdated <- FALSE
})
output$timelineInteractive <- renderTimevis({
config <- list(
editable = TRUE,
multiselect = TRUE
)
timevis(data = data_rv$data, groups = groups(), options = config)
})
observeEvent(input$timelineInteractive_data, {
if (!data_rv$userUpdated) {
timeline_data <- input$timelineInteractive_data
timeline_data$start <- as.POSIXct(timeline_data$start, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC")
if ("end" %in% names(timeline_data)) {
timeline_data$end <- as.POSIXct(timeline_data$end, format = "%Y-%m-%dT%H:%M:%OSZ", tz = "UTC")
} else {
timeline_data$end <- NA
}
timeline_data <- timeline_data[ , c("start", "end", "content", "group")]
names(timeline_data) <- c("start", "end", "content", "group")
data_rv$userUpdated <- TRUE
data_rv$data <- timeline_data
} else {
data_rv$userUpdated <- FALSE
}
})
output$table <- renderTable({
data <- input$timelineInteractive_data
data
})
}
shinyApp(ui = ui, server = server)
字符串
应用程序正在工作,但它没有得到正确的日期:(!无论我从dateInput
中选择什么,都会在前一天的22:00:00出现在timevis
和表上!而我不知道该怎么解决
1条答案
按热度按时间esyap4oy1#
原因很简单:同时,正如代码中所示,所有时间戳都以
UTC
表示,应用程序以本地时间显示它们。您可以通过转换所需时区中的start
和end
值来解决此问题。下面应该可以使用lubridate::with_tz
和tzone = Sys.timezone()
。字符串