สร้างเอกสารภาษาไทย กับ RMarkdown

ถ้าจะสร้างเอกสารที่เป็น pdf ด้วย rmarkdown (จริงๆแล้วก็ต้องบอกว่า Knit) ใน RStudio ก็ต้องมี latex ติดตั้งลงบนเครื่องก่อน สำหรับท่านใดที่ตัดสินใจว่าจะลงผมแนะนำว่าให้ใช้ texlive ครับ และเพื่อตัดปัญหาว่าจะมีปัญหาเรื่อง package ต่างๆของ latex ผมแนะนำว่าก็ลงแบบทุกอย่างเลยแล้วกันครับ กินเนื้อที่ประมาณ 3 GB ครับ อีกอย่างจากประสบการณ์เราก็ไม่ค่อยอัพเดท latex กันบ่อยอยู่แล้ว

ผมใช้ rmarkdown สร้างเอกสารเป็น pdf อยู่บ่อยครั้งแต่ส่วนมากจะเป็นภาษาอังกฤษก็มีช่วงอาทิตย์ที่ผ่านมานี้ต้องทำเป็นภาษาไทยด้วย ก็เลยอยากแชร์อะไรบ้างครับ

code หลักๆ สำหรับให้ rmarkdown  มันสร้างภาษาไทยเป็น pdf ได้ก็เพียง load package ที่จำเป็นสำหรับภาษาไทยใน latex ครับ โดยผมแนะนำว่าเพื่อความง่ายก็ขอให้เข้ารหัสสำหรับเอกสารหรือไฟล์ .Rmd เป็นแบบ Unicode หรือ UTF-8 ครับและก็ใช้ xelatex เป็นตัวโปรแกรมหลักสำหรับ latex ครับ เพราะมันใช้ได้ดีกับภาษาไทยและก็ไม่ต้องกังวลเรื่องการตัดคำครับเพราะมันสามารถทำได้กับภาษาไทยเราครับ ตัวอย่าง code อยู่ด้านล่างนี้ครับ หลักก็มีแค่ส่วนของ head-includes:

---
title: "ทดสอบ" 
header-includes:
  - \usepackage{xunicode} 
  - \usepackage{xltxtra}
  - \defaultfontfeatures{Scale=MatchLowercase} 
  - \setmainfont[Scale=1.0]{Angsana New} 
  - \XeTeXlinebreaklocale "th"
  - \XeTeXlinebreakskip = 0pt plus 1pt 
output: 
   pdf_document: 
     latex_engine: xelatex
---

## R Markdown ภาษาไทย
อ ะ ไ ร สั ก อ ย่ า ง

มันต้องมีอะไรสักอย่างในจักรวาลนี้

ที่พลัดหลงไปจากมิติกาลเวลา

อะไรสักอย่างที่โคลัมบัสและยูลิซีสตกสำรวจ

อะไรสักอย่างที่นักดาราศาสตร์กรีกและอาหรับมิได้ค้นพบ

อะไรสักอย่างที่ศาสดาของโลกลืมเทศนาสั่งสอน

อะไรสักอย่างที่ขาดหายไประหว่างหลุมดำ

..

```{r cars}
summary(cars)
```

ผลลัพท์ที่ได้ก็ประมาณนี้ครับ

ส่วนใครที่ต้องการสร้างเอกสารแบบแปลกๆสวยๆ ผมอยากแนะนำให้ศึกษา latex เพิ่มครับ แล้วจะรู้ว่าใช้ rmarkdown สร้างเอกสารlatex สะดวกจริงๆ

###

มีคนถามมาว่าในกรณีที่ใช้ rmarkdown สร้างเอกสาร html ที่ chunk ของคำสั่ง r มีการ return ค่าที่เป็นภาษาไทย อย่างตัวอย่างด้านล่างนี้มันไม่มีข้อความอะไรออกมาเลย จะทำอย่างไรถึงแม้จะใช้ Sys.setlocate(locale=”Thai”) หรือ rmarkdown::render(“file.Rmd”,enconding = “UTF-8”) แล้วก็ตาม (กรณีใช้ R ใน Windows)

วิธีที่พอจะช่วยแก้ปัญหานี้ได้บ้างระหว่างรอการแก้จากผู้พัฒนาโดยตรงที่ผมแนะนำก็คือว่าแทนที่จะ ให้มัน return ภาษาไทยออกมา ก็ให้มัน return เป็นภาษาอังกฤษ แล้วค่อยแทนที่ภาษาอังกฤษนั้นด้วยภาษาไทยที่ต้องการในไฟล์ html ที่ถูกสร้างขึ้นมาโดยตรงลองดูตัวอย่างด้านล่างนี้ครับ

ในตัวอย่างนี้ข้อความที่จะแทนที่เป็นภาษาไทยถูกเก็บไว้อีกไฟล์ (“txt4replace.R”)

library(rmarkdown)
library(stringr)

writeoutput <- function(msg,filename) {
 con <- file(filename, "w")
 tryCatch({
 cat(iconv(msg, to="UTF-8"), file=con, sep="\n")
 },
 finally = {
 close(con)
 })
}

ReplaceHTML <- function(filename,outfile) {
 htmlcode <- readLines(filename, encoding = "UTF-8")
 #read TH txt
 source("txt4replace.R")
 newhtmlcode <- str_replace_all(htmlcode,txt4replace ) 
 writeoutput(msg = newhtmlcode,filename = outfile)
}


#generate html
render("myfile.Rmd")

#replace TH txt
suppressWarnings(ReplaceHTML("myfile.html","new_myfile.html"))
browseURL("new_myfile.html")

ตัวอย่างไฟล์ "txt4replace.R"

THtext <- c("ทดสอบ","โรงเรียน","เที่ยว")
Encoding(THtext) <- "UTF-8"
txt4replace<-c("Xtxt1" = THtext[1],
 "Xtxt2" = THtext[2],
 "Xtxt3" = THtext[3])

 

หรือจะใช้วิธีบังคับให้มันใช้ UTF-8 ตั้งแต่ตอน render เลยก็ได้เช่น

```{r}
enc <- function(txt,...) iconv(txt, to="UTF-8")
```
```{r, echo=FALSE, results='asis', render= enc}
fn ที่ return ภาษาไทย
```