以下是我在shiny publish中遇到的问题以及解决方法,以供大家参考
首先我有一个带有中文的shiny代码,如下所示:
library(shiny)
ui <- fluidPage(
p("这个是一个中文测试"),
checkboxGroupInput(
inputId = "test",
label = "选择一门语言:",
choiceNames = c("中文", "英语", "其他"),
choiceValues = c(1, 2, 3)
)
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
上述shiny在Rstudio IDE中正常打开
然后我分别将其publish到shinyapp.io和RStudio-connect server等server端,发现均失败了,前者是报错XXX包未找到,后者报错XXX字符有问题;同时我也在Deploy页面发现以下warning:
Warning message:
In fileDependencies.R(file) :
Failed to parse C:/Users/guk8/AppData/Local/Temp/RtmpKeuyz5/file3edc27cd319/app.R ; dependencies in this file will not be discovered.
shinyapps.io
通过在google上的搜索,初步怀疑是中文字符编码所导致的;而为何在shinyapp.io不是报中文字符的问题呢?
在回答这个问题之前,我们可以尝试将中文从checkboxGroupInput
的choiceNames
参数中剔除,换成英文,如下所示:
library(shiny)
ui <- fluidPage(
p("这个是一个中文测试"),
checkboxGroupInput(
inputId = "test",
label = "选择一门语言:",
# choiceNames = c("中文", "英语", "其他"),
choiceNames = c("Chinese", "English", "Others"),
choiceValues = c(1, 2, 3)
)
)
server <- function(input, output, session) {
}
shinyApp(ui, server)
现在shiny app可以正常的publish了
这个是什么原因呢,暂时可以认为shinyapp.io不支持我本地PC机(win10)上publish的shiny app中除label以外的地方含有中文
此时看下我本地PC机的R locale
> Sys.getlocale()
[1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936"
此时R code的encoding如下
> options()$encoding
[1] "UTF-8"
这时我怀疑应该是本地PC机编码语言的问题,所以将上述choiceNames
参数带有中文的shiny app放到linux的Rstudio-server上运行
linux的locale如下所示:
anlan@ubuntu:~$ locale
LANG=zh_CN.GBK
LANGUAGE=zh_CN:zh:en_US:en
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=
以及R locale如下所示:
> Sys.getlocale()
[1] "LC_CTYPE=zh_CN.UTF-8;LC_NUMERIC=C;LC_TIME=zh_CN.UTF-8;LC_COLLATE=zh_CN.UTF-8;LC_MONETARY=zh_CN.UTF-8;LC_MESSAGES=zh_CN.UTF-8;LC_PAPER=zh_CN.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=zh_CN.UTF-8;LC_IDENTIFICATION=C"
在此系统下,app能正常的publish到shinyapps.io上,如下所示:
从google一些资料中可看到,若想编码类似中文字符,需要将R locale改成UTF-8(可能又不只是这个原因,但至少我能在现在这个linux系统中正常publish中文的shiny app了。。。)
RStudio connect
除了shinyapps.io外,我们还可以publish到RStudio-connect
但是得注意RStuido-connect的server的locale
我最开始的linux下的locale是zh_CN.GBK
,我无论从Rstudio-server还是PC端的Rstudio-destop都无法正常publish;报错大致如下:
invalid multibyte stringr at xxx line
并伴随着以下warnings:
Warning message:
In fileDependencies.R(file) :
Failed to parse C:/Users/guk8/AppData/Local/Temp/RtmpKeuyz5/file3edc27cd319/app.R ; dependencies in this file will not be discovered.
起初我以为是parse()
函数导致中文字符无法被编译,但是当我将中文字符转化为UTF-8后还是无法正常publish
这里有个比较trick的方法可以解决上述问题,将中文字符写入外部文件word.txt中,然后用read.table()
读入并指定fileEncoding = utf-8
参数,最后将中文字符赋予某个向量或者列表,最后在shiny ui代码中引用
上述方法经尝试是可行的!!!但是,太过于繁琐。。。
最后我将上述问题的起源猜测于RStudio connect的server,可能是server的locale的问题,即在/etc/default/locale
中添加下述命令:
LANG=en_US.utf8
LANGUAGE=en_US:en
即将server的LANG从原来的zh_CN.GBK
转化为en_US.utf8
现在的server locale如下:
anlan@ubuntu:~$ locale
LANG=en_US.utf8
LANGUAGE=en_US:en
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
此时server上的R locale如下所示:
> Sys.getlocale()
[1] "LC_CTYPE=en_US.utf8;LC_NUMERIC=C;LC_TIME=en_US.utf8;LC_COLLATE=en_US.utf8;LC_MONETARY=en_US.utf8;LC_MESSAGES=en_US.utf8;LC_PAPER=en_US.utf8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.utf8;LC_IDENTIFICATION=C"
现在无论是PC Rstudio destop还是Rstudio server上的中文shiny程序,均能正常publish到RStudio-connect上了。。。
虽然我无法解释具体的原因,可能还是server的语言编码导致之前无法publish;但是至少来说,问题是解决了。。。
以上是这两天debug的过程,希望对大家在遇到shiny中文报错的时候有报错哈~
本文出自于http://www.bioinfo-scrounger.com转载请注明出处