Sys.Date() 在闪亮的应用程序中显示错误的日期
Posted
技术标签:
【中文标题】Sys.Date() 在闪亮的应用程序中显示错误的日期【英文标题】:Sys.Date() shows wrong date in shiny appsSys.Date() 在闪亮的应用程序中显示错误的日期
【发布时间】:2016-01-19 04:31:57
【相关技术】:@tags@
【问题描述】:
此代码应显示昨天作为开始日期,并以今天作为最后一个选项结束。 它工作了几个月,我没有改变任何东西,但自从几周以来我得到了错误的日期。
如果我在本地运行此代码、在我的 ubuntu 服务器上运行 rstudio 或连接到运行此代码的闪亮服务器,它会显示前天。
Sys.setenv(TZ='GMT')
shinyApp(
ui <- basicPage(
dateRangeInput("daterange", "Daterange",start = Sys.Date()-1
,end = Sys.Date()-1,max=Sys.Date())
),
server <- function(input,output)
)
我发现了这个问题,In Shiny for R, why does Sys.Date() return yesterday's date inside a dateInput?,并且 start=NULL,end=NULL 今天我得到了正确的结果,但是昨天我需要这对我来说没有解决方案。
如果我在控制台中运行 Sys.Date(),它会在本地和我的服务器上为我提供正确的日期。仅当我将其作为闪亮的应用程序运行时才会出现此问题。
21.10.2015 更新
感谢 Oskar Forsmo 建议在应用程序中获取 system("date") 的建议,我尝试了一下,这给了我正确的日期和时间。
它变得更加奇怪:
library(shiny)
values <- reactiveValues()
shinyApp(
ui <- basicPage(
uiOutput("timerange"),
textOutput( "today" )
),
server <- function(input,output)
isolate(values$day <- Sys.Date())
output$today <- renderText(
as.character(values$day-1)
)
output$timerange <- renderUI( dateRangeInput("daterange", "Daterange",start = values$day-1
,end = values$day-1,max=values$day) )
)
在输出对象“今天”中我有正确的日期,在 uiOutput“时间范围”中我有错误的日期,它再次显示前天。
我会提供截图,因为我自己都不相信。
wrong day in dateRangeInput, right in textOutput
最重要的是,在闪亮的服务器上运行的应用程序向我的一些同事显示了正确的时间/日期,而有些人得到了相同的错误日期。
为了隔离错误,因为我在 renderText 中有正确的日期,所以我的桌面触发的 dateRangeInput 对象一定有问题?!
2015 年 10 月 29 日更新
我没有更改代码/服务器上的任何内容,但它现在显示正确的日期,不知道为什么,但它从今天开始就可以使用。如果有人知道为什么会发生这种情况,我将非常感激。
【问题讨论】:
你试过在 /usr/lib/R/etc/Renviron 中设置时区吗? 查看Sys.timezone()
我现在在 /usr/lib/R/etc/Renviron/Renviron.site 中使用 'TZ = "GMT" ' 行设置时区 - 我尝试了 GMT、CET 和 CEST。 sys.timezone()在RStudio中显示设置值,但问题依旧。
我刚刚检查了 ubuntu 服务器上的日期,它正确设置为 CEST。我现在真的很困惑,似乎不是时区问题。如上所述,我什至在我的 Windows 桌面上有这种行为。
嗯,那我不知道是什么原因造成的。出于好奇,如果您从闪亮的应用程序中获取system("date")
的日期会发生什么?
【参考方案1】:
你需要让你的 UI 成为一个函数。闪亮的缓存是 UI 部分,所以它只是提取缓存的Sys.Date()
。见https://github.com/rstudio/shiny/issues/1882
您看到的日期通常是您的服务器上次重新启动的时间。
从上面的链接复制:
打开这个:
ui <- fluidPage(...)
进入这个:
ui <- function(req)
fluidPage(...)
【讨论】:
【参考方案2】:我遇到了同样的问题,这是由于本地时区与服务器时区不同。当我将每个日期转换为 POSIX 日期(包括时区)时,我能够获得正确的日期。如果您希望闪亮显示由Sys.Date()
创建的原始格式,您还必须使用format
参数。
这是工作代码:
dateRangeInput("daterange", "Daterange", start = as.POSIXct(Sys.Date()-1),
end = as.POSIXct(Sys.Date()-1), max = as.POSIXct(Sys.Date())),
format = 'yyyy-mm-dd')
【讨论】:
以上是关于Sys.Date() 在闪亮的应用程序中显示错误的日期的主要内容,如果未能解决你的问题,请参考以下文章