在本地工作的 R 脚本无法在 shinyapp.io 上工作

R script working locally not working on shinyapp.io

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

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

在 RStudio 中工作正常(绘制了一个漂亮的小直方图)。当在 shinyapps.io 上加载时,'title panel' 文本和侧边栏显示,但一两秒后它要么 - 报告错误“'from' 不能为 NA、NaN 或无限”或 - 屏幕变灰并且脚本停止(?) 在这两种情况下都没有生成直方图。

让我感到困惑;很想知道是否有人对我出错的地方有任何建议。可能与 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 version: 3.1.2
2015-02-22T10:00:50.509043+00:00 shinyapps[32851]: rmarkdown version: 0.0.0
2015-02-22T10:00:50.507340+00:00 shinyapps[32851]: Shiny version: 0.11.1
2015-02-22T10:00:50.509508+00:00 shinyapps[32851]: knitr version: 0.0.0
2015-02-22T10:00:50.784283+00:00 shinyapps[32851]:
2015-02-22T10:00:50.784285+00:00 shinyapps[32851]: Starting Shiny with process ID: '14'
2015-02-22T10:00:50.792403+00:00 shinyapps[32851]:
2015-02-22T10:00:50.792405+00:00 shinyapps[32851]: Listening on http://0.0.0.0:57429

你有两个问题。首先,您遗漏了数据中的一些引号。但是,解决这个问题并没有改变结果。我复制了你的代码,修复了引号,并部署了它并得到了相同的结果(在本地工作但不在 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")

有趣的是,无论我是在 运行 本地还是在 shinyapps.io 上,我都得到了完全相同的 "dates" 输出结果。我原以为我会得到法语的月份名称之类的。但是,对于 "location" 输出,我得到了不同的结果。 本地:

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

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

在一个 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 可以抛出但不能接受,至少就月份名称而言。这有多奇怪?

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

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

匹配((月),c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"))

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

df$Date <- with(df, paste(Year, match((Month),c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")), 日, sep="-"))

尽情享受吧!