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

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]: Shiny版本: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 '14' 启动Shiny
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个回答

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论坛上有一个错误报告(我不知道与shinyapps.io使用的Ubuntu有什么关系),指出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上不起作用,但在本地可以。看来这也是由于shinyapps.io与as.Date在月份名称方面不兼容所致。 - jalapic

2
我也遇到了同样的问题。看起来shinyapps.io使用了不同的语言环境设置。我试图在as.Date()函数中使用%b,但它无法正确地转换日期,导致记录为空。这完全搞砸了我,因为它没有抛出任何错误。调试找到那一行代码并不好玩!
我创建了以下内联代码来解决我的月份名称,因为它是以这种方式格式化在我的数据源中,所以我必须进行转换:
match((Month),c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"))
上面代码中的Month是变量名,保存着月份名称的值。一个使用此代码的完整行示例:
df$Date <- with(df, paste(Year, match((Month),c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")), Day, sep="-"))
祝您愉快!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接