ถ้าจะสร้างเอกสารที่เป็น pdf ด้วย rmarkdown (จริงๆแล้วก็ต้องบอกว่า Knit) ใน RStudio ก็ต้องมี latex ติดตั้งลงบนเครื่องก่อน สำหรับท่านใดที่ตัดสินใจว่าจะลงผมแนะนำว่าให้ใช้ texlive ครับ และเพื่อตัดปัญหาว่าจะมีปัญหาเรื่อง package ต่างๆของ latex ผมแนะนำว่าก็ลงแบบทุกอย่างเลยแล้วกันครับ กินเนื้อที่ประมาณ 3 GB ครับ อีกอย่างจากประสบการณ์เราก็ไม่ค่อยอัพเดท latex กันบ่อยอยู่แล้ว แต่ถ้าคิดว่าเอาแค่เล็กๆก็พอ งั้นผมขอแนะนำ tinytex แล้วกันครับ วิธีติดตั้งก็ง่ายมาก ตามนี้เลยครับ
install.packages('tinytex')
tinytex::install_tinytex()
ผมใช้ 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 ภาษาไทย ```