本地工作的R脚本不能在shinyapp.io上工作

时间:2015-02-22 10:12:58

标签: r shiny as.date

我试图整理一个R + Shiny应用程序,至少在开始时,它会绘制日期数据的直方图。我在RStudio的本地系统上运行得很好,但是在shinyapps.io它没有用。

此刻,应用程序非常简单 - 用户界面并没有真正做任何事情,数据只是测试数据的一小部分。

在RStudio中工作正常(绘制一个漂亮的小直方图)。在shinyapps.io上加载时,'标题面板'文本和侧边栏显示,但在一两秒之后 - 报告错误"'来自'不能是NA,NaN或无限的"要么 - 屏幕变灰并且脚本停止(?) 在两种情况下都没有产生直方图。

让我感到困惑;我很想知道是否有人对我出错的地方有任何建议。也许它与as.Date有关 - 一个可能类似的问题报告here,没有任何解决方案。

我的两个闪亮文件是:

# 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]:针织版: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:&#39; 14&#39;
  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

2 个答案:

答案 0 :(得分:5)

你有两个问题。首先,您错过了数据中的一些引号。但是,修复并没有改变结果。我复制了你的代码,修改了引号,并部署了它并获得了相同的结果(在本地工作但在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在将月份名称转换为日期值方面存在一些困难。但是,我不知道为什么会这样。

<强>更新: 在a lead provided by 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")

有趣的是,我对&#34;日期&#34;得到了完全相同的结果。输出我是在本地运行还是在shinyapps.io上运行。我以为我会用法语或其他东西获得月份名称。但是,对于&#34; location&#34;输出,我得到了不同的结果。 本地:

  

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论坛上有a bug report(我不知道与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可以把它拿出来但不能接受它,至少就月份名称而言。这有多奇怪?

答案 1 :(得分:2)

我遇到了同样的问题。似乎shinyapps.io使用不同的区域设置。我试图在as.Date()函数中使用%b,并且无法正确转换日期,从而产生空记录。这完全搞砸了我,因为它也没有抛出任何错误。调试发现1行不好玩!

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

匹配((月),C( “月”, “月”, “月”, “月”, “月”, “君”, “月”, “月”, “月”, “十月”, “月”, “DEC”))

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

df $ Date&lt; - with(df,paste(年份,匹配((月),c(“Jan”,“2月”,“3月”,“4月”,“5月”) ,“Jun”,“Jul”,“Aug”,“Sep”,“Oct”,“Nov”,“Dec”)),Day,sep =“ - ”))

享受!