2016年1月25日

如何在 CentOS 安裝 R 語言,如何產生 PDF Report

要在 CentOS 安裝 R 語言執行環境,如果已經安裝好了 EPEL,直接以 yum 安裝就好了。

首先搜尋 R-project 相關的套件

yum search R-project

然後安裝需要的套件

yum -y install R.x86_64 R-devel.x86_64 R-java.x86_64 R-java-devel.x86_64

如果要自己編譯 R,必須要先下載套件(必須有 --enable-R-shlib,否則安裝 RStudio-server 會遇到問題)

yum -y install readline-common readline-devel.x86_64 texinfo texlive

tar zxvf R-3.2.2.tar.gz
cd R-3.2.2
./configure --prefix=/opt/R-3.2.2 --enable-R-shlib --with-libpng --with-jpeglib --with-libtiff --with-x
make
make install

執行 configure 時,會抱怨

configure: WARNING: neither inconsolata.sty nor zi4.sty found: PDF vignettes and package manuals will not be rendered optimally

簡單測試一下,首先編輯一個檔案 test.r

#!/usr/bin/Rscript
print("HelloR")

修改執行的權限: chmod 755 test.r,有兩種方式可以執行 R Script

# 方法1
Rscript test.r
# 方法2
./test.r

在 windows 安裝 R 並測試產生 PDF

我們先在 windows 環境測試如何產生 PDF。

為了要處理文件中以及圖表中的中文顯示問題,還必須做一些額外的設定,在設定過程中,如果有遇到 MiKTeX 或是 RStudio 需要更新套件,就直接接受更新就可以了。

  1. 安裝 R 以及 RStudio
  2. 安裝 rmarkdown, devtools, showtext

    install.packages("rmarkdown")
    install.packages("devtools")
    install.packages("showtext")
  3. 安裝 rticles

    devtools::install_github("rstudio/rticles")
  4. 安裝 MiKTeX 安裝後要到選單 (MilkTex 2.9 -> Maintenance(Admin) -> Update(Admin) 更新套件

  5. 打開 RStudio Tools -> Global Options -> Sweave 將 "Weave Rnw Files using" 改為 "knitr" 將 "Typeset LaTex into PDF using" 改為 "XeLaTex"

  6. File -> New File -> R Markdown Default Ouput Format 選擇 PDF 假設存檔是存成 test.Rmd,在該檔案的同一個目錄中,建立一個新檔案 header.tex,編碼為 UTF-8,以下為內容,如果把 標楷體 改成 simsun.ttc 就會變成宋體

    \usepackage{xeCJK}
    \setCJKmainfont{標楷體}    % 可換字型 NSimSun
  7. 在 test.Rmd 中,調整檔案的內容如下

    ---
    title: "test"
    output:
      pdf_document:
        keep_tex: yes
        latex_engine: xelatex
        includes:
          in_header: header.tex
      html_document: default
      word_document: default
    ---
    
    file content: 中文
    ```{r fig.showtext=TRUE}
    summary(cars)
    print("中文")
    plot(cars,main='中文issue')
    plot(cars,main='中文issue2')
    ```
    
    ```{r, echo=FALSE}
    plot(cars)
    ```
  8. 為了控制報表輸出的目錄及檔案名稱,可以搭配 setwd 及 rmarkdown::render 的一些參數使用

    library("rmarkdown")
    setwd("D:/git/project/r")
    rmarkdown::render(input="test.Rmd", output_format="all", output_file="20151201", output_dir="output", encoding="UTF-8")

Ref: showtext package integration

在 CentOS 7 測試產生 PDF

為了在 CentOS 7 產生 PDF Report 我們必須先安裝一些套件

  1. 安裝 rstudio-server,因為 pandoc 是產生 PDF 常用的指令,所以直接在 /usr/bin/pandoc 產生一個連結

    wget https://download2.rstudio.org/rstudio-server-rhel-0.99.489-x86_64.rpm
    yum install --nogpgcheck rstudio-server-rhel-0.99.489-x86_64.rpm
    ln -s /usr/lib/rstudio-server/bin/pandoc/pandoc /usr/bin/pandoc
  2. 安裝 textlive 及相關套件

    yum -y install texlive texlive-latex texlive-xetex
    yum -y install texlive-collection-latex
    yum -y install texlive-collection-latexrecommended
    yum -y install texlive-xetex-def

    因為在測試過程中,一直發生一些套件缺少的錯誤訊息,所以直接把所有 textlive 的相關套件都安裝進去。

    yum -y install 'texlive-*'
  3. 因為測試時發生以下的 titling.sty 錯誤,但在 CentOS 卻沒有這個套件,所以根據 Missing *.sty files when generating PDFs #359 的建議,直接安裝 titling

    wget http://mirrors.ctan.org/macros/latex/contrib/titling.zip
    unzip titling.zip
    cd titling
    latex titling.ins
    sudo mkdir -p /usr/share/texlive/texmf-dist/tex/latex/titling
    sudo cp titling.sty /usr/share/texlive/texmf-dist/tex/latex/titling/
    sudo texhash
  4. 處理 linux 的 fonts 通常習慣使用 windows 字型,我們可以將 c:\windows\fonts 裡面的幾個常用字型上傳到 linux

    mkdir /usr/share/fonts

    然後將 simsun.ttc, msyh.ttf, msyhbd.ttf, sumhei.ttf 上傳到這個資料夾

    用以下指令更新 linux fonts

    fc-cache -f -v

    如果有更新成功,可以在這個指令的輸出結果中,看到中文字型

    fc-list
  5. 將剛剛測試的 header.tex 以及 test.Rmd 上傳到 linux 任意一個資料夾 但要注意的是,header.tex 只能填寫剛剛有上傳的字型名稱,不能填寫為字型的檔案名稱

    \usepackage{xeCJK}
    \setCJKmainfont{NSimSun}
  6. 進入 R console 在 text.Rmd 以及 header.tex 的目錄中,進入 R console 的命令列中,安裝 rmarkdown以及 showtext,然後用 rmarkdown render PDF

    install.packages("rmarkdown")
    install.packages("showtext")
    
    library("rmarkdown")
    rmarkdown::render("test.Rmd")

    測試過程如下:

    > rmarkdown::render("test.Rmd")
    processing file: test.Rmd
      |...........                                                      |  17%
      ordinary text without R code
    
      |......................                                           |  33%
    label: unnamed-chunk-1 (with options) 
    List of 1
     $ fig.showtext: logi TRUE
    
      |................................                                 |  50%
      ordinary text without R code
    
      |...........................................                      |  67%
    label: unnamed-chunk-2 (with options) 
    List of 1
     $ echo: logi FALSE
    
      |......................................................           |  83%
      ordinary text without R code
    
      |.................................................................| 100%
    label: unnamed-chunk-3 (with options) 
    List of 1
     $ echo: logi FALSE
    
    output file: test.knit.md
    
    /usr/bin/pandoc +RTS -K512m -RTS test.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures --output test.tex --template /usr/lib64/R/library/rmarkdown/rmd/latex/default.tex --highlight-style tango --latex-engine xelatex --include-in-header header.tex --variable 'geometry:margin=1in' 
    /usr/bin/pandoc +RTS -K512m -RTS test.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures --output test.pdf --template /usr/lib64/R/library/rmarkdown/rmd/latex/default.tex --highlight-style tango --latex-engine xelatex --include-in-header header.tex --variable 'geometry:margin=1in' 
    
    Output created: test.pdf
  7. 最後我們就能在 linux 得到裡面有中文字的 PDF Report

  8. 如果在 render 時加上 "all" 的參數,就可以同時取得 html, docx 及 pdf 三種格式的文件

    rmarkdown::render("test.Rmd", "all")