不写R包的分析师不是好全栈

Sldify解决中文乱码

    R

slidify是款用Rmd生成精美slides的R包,作者是Ramnath Vaidyanathan。这个包并没有在CRAN的镜像上,而是托管在Github上,需要用以下方法安装:

(在运行之前需要保证安装了devtools,如果没有请跑下install.packages(‘devtools’))

library(devtools)
install_github("slidify", "ramnathv")
install_github("slidifyLibraries", "ramnathv")

不过在Slidify使用的过程中会出现几个比较难受的问题,尤其是在windows下编译中文的Slidify会出现乱码.本文叙述了Slidify下解决这个bug的方法.


Slidify解决中文乱码


Slidify中文乱码实际上是只出现在windows平台,若是追寻其原因还是因为是windows的编码方式造成的(windows是GBK编码,而基本上linux,OS,以及R的用的是UTF-8的编码)


比如,在编写了一个中文的slidify的Rmd文件,使用以下命令来进行编译的时候,会报错


slidify("index.Rmd")



Error in substring(string, start, end) :
invalid multibyte string at <ba>
<73>ubtitle : 姝f€佸彉閲忕殑浜屾鍨<8b>

对此,我有三种解决办法,第一种是使用knitr来进行编译,第二种是改变R的环境语言,第三种是改变windows的环境语言,几种方法各有利弊.



I 改为使用 knitr 进行编译


最新版的knitr和Slidify已经相互支持,可以再Slidify的YAML里面增加一行:


knit        : slidify::knit2slides

也就是使用knitr来进行编译,编译就绕过了slidify()函数,而是改用Rstudio的按钮:knit HTML来完成,可以完成中文语言的支持.





II 改变R的环境语言


实际上slidify函数出错是因为R的环境语言的设置问题造成的.首先,我们可以用这个函数查看当前设置的语言:


Sys.getlocale("LC_CTYPE")

## [1] "English_United States.1252"

可以看到(如果你没有更改配置语言的话),应该显示你当前的语言是中文,奇怪的是,我们需要一个非中文的编译环境才能完成Slidify的中文编译,逻辑上有些抽象,而事实上运行一段设置R语言环境的代码就可以完成这个工作:


  Sys.setlocale("LC_CTYPE", "English_United States.1252")

换句话说,如果使用slidify编译不出来就可以改用以下的代码:


Sys.setlocale("LC_CTYPE", "English_United States.1252")
slidify("index.Rmd")

不用担心,这个方法只是改变了R的环境语言,并不影响系统的配置,甚至在下一次启动R的时候,会自动改回"Chinese (Simplified)_People’s Republic of China.936"的语言形式.


这也是第二个方法的弊端:每次打开R都要重新运行一遍这个代码.




III 改变系统语言环境


这个方法一劳永逸,是个大杀器,不过还是有一两个小弊端的,先说下操作方法:


开始>>>>>控制面板>>>>>>时钟,语言和区域



打开区域和语言,更改语言为 英语(美国)



之后重新启动R,再运行查看R的环境语言就可以看到已经改成英文的环境了


Sys.getlocale("LC_CTYPE")

## [1] "English_United States.1252"

改变windows的全局语言会出两个小问题:



  1. 加载某些包的时候,会有一些报错和警告出现乱码,不过也只有加载包的时候会出现,并不影响平时的使用。


  2. shiny的中文支持也依赖于这个环境语言的设置,和Slidify的设置刚好相反,Shiny的中文一定要求环境语言是中文!所以设置了Windows的环境语言在使用shiny的时候又要改回原先的编码形式了…




page PV:  ・  site PV:  ・  site UV: