0%

RStudio Shiny Publish - 中文编码

以下是我在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.ioRStudio-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不是报中文字符的问题呢?

在回答这个问题之前,我们可以尝试将中文从checkboxGroupInputchoiceNames参数中剔除,换成英文,如下所示:

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上,如下所示:

shinyapp1

从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转载请注明出处