8

我正在尝试组合一个 R + Shiny 应用程序,该应用程序至少在最初绘制日期数据的直方图。我让它在 RStudio 的本地系统上运行良好,但在 shinyapps.io 中它不起作用。

目前,该应用程序非常简单——用户界面实际上并没有做任何事情,数据只是测试数据的一小部分样本。

在 RStudio 中工作正常(绘制一个漂亮的小直方图)。在shinyapps.io 上加载时,“标题面板”文本和侧边栏会显示,但在一两秒后它会报告错误“'from' cannot be NA, NaN or infinite”或 - 屏幕变灰并且脚本停止(?) 在这两种情况下都不会产生直方图。

有没有让我感到困惑;有兴趣听听是否有人对我哪里出错有任何建议。可能与 as.Date 相关 -这里报告了一个可能类似的问题,但没有任何解决方案。

我的两个闪亮文件是:

# ui.R

shinyUI(fluidPage(
  titlePanel("title panel"),

  sidebarLayout(
    sidebarPanel(

      ),

    mainPanel(

      plotOutput("distPlot")

    )
  )
))

# server.R
library(shiny)

shinyServer(function(input, output){

  output$distPlot <- renderPlot({

      text_date <- c("9 March 2006", "31 October 2008", "24 September 2008", "27 February 2009", "19 May 2014", "11 December 2009", "7 August 2013", "8 December 2014", "2 February 2010", "22 December 2014", "20 December 2011", "4 September 2009", "19 December 2013", "10 October 2007", "19 September 2008")

      num_date <- as.Date(text_date, format = "%d %B %Y")

     #plot a histogram

      hist(num_date, 
         breaks = "years",
         format = "%Y",
         freq = TRUE)

  })

})

showLogs() 没有报告任何错误(或除版本、启动和侦听之外的任何错误...):

2015-02-22T10:00:50.507273+00:00 shinyapps[32851]:R 版本:3.1.2
2015-02-22T10:00:50.509043+00:00 shinyapps[32851]:rmarkdown 版本:0.0.0
2015- 02-22T10:00:50.507340+00:00 shinyapps[32851]:闪亮版本:0.11.1
2015-02-22T10:00:50.509508+00:00 shinyapps[32851]:knitr 版本:0.0.0
2015-02- 22T10:00:50.784283+00:00 shinyapps[32851]:
2015-02-22T10:00:50.784285+00:00 shinyapps[32851]: 使用进程 ID 启动 Shiny: '14'
2015-02-22T10:00:50.792403 +00:00 shinyapps[32851]:
2015-02-22T10:00:50.792405+00:00 shinyapps[32851]: 监听http://0.0.0.0:57429

4

2 回答 2

6

你有两个问题。首先,您错过了数据中的一些引号。但是,修复它并没有改变结果。我复制了你的代码,修正了引号,并部署了它并得到了相同的结果(在本地工作,但不在 shinyapps.io 上工作)。

第二个(也是更重要的问题)是不同操作系统处理日期的方式。我将 server.R 的数据部分更改为以下内容:

text_date <- c("2006-03-09", "2008-10-31", "2008-09-24", "2009-02-27", "2014-05-19", "2013-08-07", "2014-12-08", "2010-02-02", "2014-12-22", "2011-12-20", "2009-09-04", "2013-12-19", "2007-10-10", "2008-09-19")

这在本地和 shinyapps.io 上都有效。所以问题不在于您的程序,而在于日期的处理方式。

我认为这个问题可能与单个数字日期需要前导零有关,但改变它并不能解决问题。但是,当我用两位数字替换月份名称时,它再次在本地和 shinyapps.io 上工作。因此,shinyapps.io 似乎很难将月份名称转换为日期值。但是,我不知道为什么会发生这种情况。

更新:在Fereshteh Karimeddini 提供的指导下,我通过嵌入以下代码修改了文件:在 server.R 中:

output$dates = renderText({format(num_date, format = "%d %B %Y")})
output$location = renderText({Sys.getlocale(category = "LC_ALL")})

在 ui.R 中:

textOutput("dates")
textOutput("location")

有趣的是,无论我是在本地运行还是在 shinyapps.io 上运行,“日期”输出的结果都完全相同。我原以为我会用法语或其他方式获得月份名称。但是,对于“位置”输出,我得到了不同的结果。本地:

LC_COLLATE=English_United States.1252;
LC_CTYPE=English_United States.1252;
LC_MONETARY=English_United States.1252;
LC_NUMERIC=C;
LC_TIME=English_United States.1252

在 Shinyapps.io 上:

LC_CTYPE=C.UTF-8;
LC_NUMERIC=C;
LC_TIME=C.UTF-8;
LC_COLLATE=C.UTF-8;
LC_MONETARY=C.UTF-8;
LC_MESSAGES=C.UTF-8;
LC_PAPER=C.UTF-8;
LC_NAME=C;
LC_ADDRESS=C;
LC_TELEPHONE=C;
LC_MEASUREMENT=C.UTF-8;
LC_IDENTIFICATION=C

注意:添加回车以提高可读性。

在 debian 论坛上有一个错误报告(我不知道与 Ubuntu 的关系,这是 shinyapps.io 使用的),指出 C.UTF-8 不包含月份名称。然而,那是从 2012 年开始的,错误报告说它在最近的版本中得到了修复。此外,如果 shinyapps.io 上的 C.UTF-8 中确实没有月份名称,那么它不应该能够输出月份名称(它做得很好)。这让我想知道 - 如果它可以输出月份名称,为什么它不能读取月份名称?所以我试图让它做到这一点。在 server.R 中:

text_date = c("09 03 2006")
num_date <- as.Date(text_date, format = "%d %m %Y")
x = format(num_date, format = "%d %B %Y")
output$dates = renderText({x})
renum_date = as.Date(x, format = "%d %B %Y")
output$redates = renderText({format(renum_date, format = "%d %B %Y")})

在 ui.R 中:

sidebarPanel(textOutput("dates")),
mainPanel(textOutput("redates"))

在本地,sidebarPanel 和 mainPanel 显示完全相同的内容:2006 年 3 月 9 日。但是,在 shinyapps.io 上,mainPanel 显示 NA。因此,shinyapps.io 似乎可以将其发送出去,但不能接受,至少就月份名称而言。这有多奇怪?

于 2015-02-24T04:40:32.917 回答
2

我有同样的问题。似乎 shinyapps.io 使用不同的语言环境设置。我试图在 as.Date() 函数中使用 %b ,但未能正确转换日期,导致出现空记录。这完全把我搞砸了,因为它也没有抛出任何错误。调试发现那1行不好玩!

我创建了以下内联代码来解析我的月份名称,因为它在我的数据源中以这种方式格式化,所以我必须对其进行转换:

match((月),c("一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月" ","十二月"))

上面代码中的月份是保存月份名称值的变量名称。使用此代码的完整行示例:

df$Date <- with(df, paste(Year, match((Month),c("Jan","Feb","Mar","Apr","May","Jun","Jul","八月","九月","十月","十一月","十二月")) , 天, sep="-"))

享受!

于 2015-03-24T02:12:36.803 回答