1 Mở đầu: tài liệu này dành cho ai

Tài liệu này dành cho người chưa từng dùng R và có rất ít kinh nghiệm lập trình, nhưng muốn tạo ra những báo cáo R Markdown trông chuyên nghiệp và kiểm soát được hình thức của chúng. Mục tiêu không phải là biến bạn thành lập trình viên web, mà là trang bị đủ hiểu biết để bạn tự định dạng văn bản, sắp xếp bố cục, và điều chỉnh giao diện một cách tự tin.

Cách trình bày xuyên suốt là đi từ trực giác đến kỹ thuật. Với mỗi chủ đề, ta sẽ bắt đầu bằng việc giải thích vì sao nó cần thiết và một ví dụ cụ thể, rồi mới đến cú pháp chính xác. Mọi thuật ngữ tiếng Anh sẽ được giải thích ngay khi xuất hiện lần đầu. Một điểm thú vị là tài liệu này tự minh họa nhiều kỹ thuật lên chính nó; chẳng hạn các hộp màu mà bạn sắp thấy được tạo bằng đúng phương pháp trình bày ở Phần V.

Quy ước đọc. Phần lớn đoạn code trong tài liệu được trình bày để bạn đọc và học, không tự chạy khi kết xuất. Một vài ví dụ an toàn sẽ chạy thật để bạn thấy kết quả. Khi áp dụng vào tài liệu của mình, bạn sẽ tự chạy chúng.

2 R Markdown vận hành như thế nào

Trước khi học cách định dạng, bạn cần một bức tranh đơn giản về việc một tệp R Markdown biến thành trang web ra sao. Hiểu được điều này, bạn sẽ luôn biết khi gặp vấn đề thì nên sửa ở đâu.

2.1 Ba lớp: nội dung, biên dịch, kết xuất

Hãy hình dung quá trình như một dây chuyền ba công đoạn. Bạn viết một tệp có đuôi .Rmd, trong đó trộn lẫn chữ viết và code. Ở công đoạn thứ nhất, một thành phần tên là knitr chạy toàn bộ code trong tệp, lấy kết quả và biểu đồ, rồi thay chúng vào đúng vị trí, tạo ra một tệp văn bản thuần gọi là Markdown. Ở công đoạn thứ hai, một công cụ tên là Pandoc nhận tệp Markdown đó và dịch nó sang định dạng đích, thường là một trang HTML. Nói gọn theo cách của chính nhóm tác giả R Markdown, knitr lo việc chạy code và chuyển Rmd thành Markdown, còn Pandoc lo việc kết xuất Markdown sang định dạng bạn muốn.

Tệp .Rmd  ──(knitr chạy code)──►  Markdown  ──(Pandoc kết xuất)──►  HTML

2.2 Vì sao bức tranh này quan trọng

Bức tranh ba lớp cho bạn biết chính xác mỗi loại điều chỉnh nằm ở đâu. Khi bạn muốn thay đổi nội dung hay cách chạy code, bạn sửa trong các khối code. Khi bạn muốn thay đổi cấu trúc và tùy chọn tổng thể của tài liệu, chẳng hạn có mục lục hay không, bạn sửa trong phần khai báo ở đầu tệp. Còn khi bạn muốn thay đổi hình thức hiển thị như màu sắc, cỡ chữ, khoảng cách, bạn tác động vào lớp HTML bằng CSS. Vì sản phẩm cuối là một trang web, mọi quy tắc trang trí của web đều áp dụng được, và đó là lý do CSS trở thành công cụ định dạng mạnh nhất mà ta sẽ dành hẳn một phần để học.

Nếu sau này bạn chuyển sang Quarto, công cụ kế nhiệm của R Markdown, thì mô hình ba lớp này gần như không đổi; phần lớn kiến thức định dạng bạn học ở đây chuyển thẳng sang Quarto.

3 Cấu trúc và cú pháp văn bản

3.1 Ba thành phần của một tệp R Markdown

Mọi tệp .Rmd đều gồm ba loại thành phần, và việc nhận ra chúng giúp bạn không bị rối. Thành phần thứ nhất là khối khai báo ở trên cùng, nằm giữa hai dòng ba dấu gạch ngang, gọi là YAML; nó cấu hình những thứ tổng thể như tiêu đề và định dạng đầu ra. Thành phần thứ hai là văn bản thường, viết bằng cú pháp Markdown. Thành phần thứ ba là các khối code, gọi là chunk. Trên thực tế, chính tài liệu bạn đang đọc cũng được tạo từ ba thành phần này.

3.2 Định dạng chữ cơ bản

Markdown được thiết kế để viết nhanh mà vẫn định dạng được, bằng cách dùng vài ký hiệu đơn giản ngay trong dòng chữ. Bạn tạo tiêu đề bằng dấu thăng ở đầu dòng: một dấu thăng cho tiêu đề lớn nhất, hai dấu cho tiêu đề nhỏ hơn, và cứ thế. Bạn làm chữ in đậm bằng cách kẹp nó giữa hai cặp dấu sao, và in nghiêng bằng một cặp dấu sao.

# Tiêu đề cấp 1
## Tiêu đề cấp 2

Đây là một đoạn văn. Chữ **in đậm** dùng hai dấu sao, chữ *in nghiêng*
dùng một dấu sao, còn ~~chữ gạch ngang~~ dùng hai dấu ngã.

> Đây là một khối trích dẫn (blockquote), dùng dấu lớn hơn ở đầu dòng.

Một điểm người mới hay vấp là việc xuống dòng. Trong Markdown, nhấn Enter một lần không tạo ra dòng mới khi hiển thị; muốn tách thành đoạn mới, bạn phải để một dòng trống giữa hai đoạn. Đây là quy ước khác với trình soạn thảo văn bản thông thường, nên cần nhớ ngay từ đầu.

3.3 Danh sách và bảng

Danh sách không thứ tự được tạo bằng dấu gạch ngang ở đầu mỗi mục, còn danh sách có thứ tự dùng số. Bạn tạo danh sách con bằng cách thụt vào hai dấu cách.

- Mục thứ nhất
- Mục thứ hai
  - Mục con của mục hai
1. Bước một
2. Bước hai

Bảng được tạo bằng dấu gạch đứng để ngăn cột và dấu gạch ngang để tách dòng tiêu đề. Dấu hai chấm trong dòng tách quy định căn lề của cột.

| Tên biến | Mô tả             | Giá trị |
|:---------|:-----------------:|--------:|
| trái     | giữa              | phải    |

Khi nào không dùng bảng Markdown. Bảng viết tay như trên chỉ tiện cho dữ liệu nhỏ và cố định. Khi bảng đến từ kết quả tính toán, bạn nên để R tạo bảng tự động bằng knitr::kable() hoặc gói gt, sẽ học ở Phần VI.

3.4 Liên kết, hình ảnh và tham chiếu nội bộ

Bạn tạo liên kết bằng cách đặt chữ hiển thị trong ngoặc vuông, theo sau là địa chỉ trong ngoặc tròn. Chèn ảnh cũng tương tự nhưng thêm một dấu chấm than ở trước. Một tính năng rất hữu ích cho tài liệu dài là liên kết nội bộ, cho phép nhảy đến một mục khác trong cùng trang; bạn gán cho tiêu đề một định danh trong ngoặc nhọn, rồi trỏ tới định danh đó.

Đây là [một liên kết ra ngoài](https://r4ds.hadley.nz).

![Chú thích cho ảnh](duong-dan/anh.png)

## Phần phương pháp {#phuong-phap}

Xem lại [phần phương pháp](#phuong-phap) ở trên.

Công thức toán được viết giữa các dấu đô la và sẽ được hiển thị đẹp nhờ một thư viện tên MathJax đi kèm sẵn. Ví dụ, $\alpha = 0.05$ sẽ hiển thị thành ký hiệu toán học chuẩn.

4 YAML: điều khiển toàn bộ tài liệu

YAML là khối khai báo ở đầu tệp, nơi bạn bật tắt các tính năng tổng thể. Hãy hình dung nó như bảng điều khiển của tài liệu. Điều quan trọng với người mới là chú ý đến thụt lề, vì YAML dùng số khoảng trắng để hiểu cấp bậc; thụt sai sẽ gây lỗi. Dưới đây là phần YAML của chính tài liệu bạn đang đọc, kèm giải thích từng dòng.

---
title: "Tiêu đề tài liệu"
author: "Tên tác giả"
output:
  html_document:
    toc: true              # tạo mục lục
    toc_float: true        # cho mục lục nổi ở lề trái, luôn thấy khi cuộn
    toc_depth: 3           # mục lục lấy đến tiêu đề cấp 3
    number_sections: true  # tự đánh số các mục
    theme: flatly          # chọn giao diện tổng thể
    highlight: tango       # kiểu tô màu cho code
    df_print: paged        # cách hiển thị bảng dữ liệu
    code_folding: show     # cho phép ẩn/hiện code
---

4.1 Mục lục và đánh số

Tùy chọn toc quyết định có mục lục hay không, còn toc_depth quyết định mục lục đi sâu đến cấp tiêu đề nào. Khi bật toc_float, mục lục sẽ nổi ở lề trái và luôn hiển thị trong khi bạn cuộn trang, rất tiện cho tài liệu dài. Tùy chọn number_sections tự động đánh số các mục, giúp tài liệu mang dáng dấp một báo cáo học thuật.

4.2 Hiển thị code và bảng dữ liệu

Tùy chọn code_folding cho phép độc giả tự ẩn hoặc hiện code. Đặt giá trị show thì code hiện sẵn nhưng có nút thu gọn; đặt hide thì code ẩn sẵn và độc giả bấm để xem. Đây là cách hay để vừa giữ tính minh bạch vừa không làm rối người chỉ muốn đọc kết quả.

Tùy chọn df_print quyết định cách một bảng dữ liệu được in ra. Giá trị paged tạo bảng có phân trang, cho phép lật trang và cuộn cột, rất gọn khi bảng nhiều dòng. Ví dụ dưới đây chạy thật để bạn thấy hiệu ứng phân trang đó.

head(mtcars, 12)

4.3 Tính tự chứa khi chia sẻ

Theo mặc định, R Markdown tạo một tệp HTML tự chứa, nghĩa là mọi hình ảnh và thư viện được nhúng thẳng vào một tệp duy nhất, nhờ đó bạn có thể gửi tệp đó như gửi một tài liệu Word mà không lo thiếu thành phần. Tùy chọn điều khiển hành vi này là self_contained, và trong hầu hết trường hợp bạn nên để nguyên mặc định.

5 Giao diện không cần viết CSS

Trước khi học CSS, bạn nên biết rằng R Markdown đã cho sẵn nhiều lựa chọn giao diện chỉ bằng một dòng khai báo. Đây là cách nhanh nhất để tài liệu trông chuyên nghiệp.

5.1 Theme dựng sẵn

Tùy chọn theme chọn một bộ giao diện tổng thể, lấy từ một thư viện mẫu tên Bootswatch. Các theme hợp lệ gồm default, cerulean, journal, flatly, darkly, readable, spacelab, united, cosmo, lumen, paper, sandstone, simplex và yeti. Mỗi theme quy định sẵn phông chữ, màu sắc và khoảng cách, nên chỉ cần đổi tên theme là toàn bộ diện mạo thay đổi theo.

5.2 Kiểu tô màu cho code

Tùy chọn highlight quyết định cách các đoạn code được tô màu cú pháp. Các kiểu được hỗ trợ gồm default, tango, pygments, kate, monochrome, espresso, zenburn, haddock, breezedark và textmate. Bạn có thể thử vài kiểu để chọn cái dễ đọc nhất với mình.

5.3 Tùy biến hiện đại bằng bslib

Ngoài việc chọn tên theme có sẵn, có một cách tinh chỉnh sâu hơn nhưng vẫn không phải viết CSS, đó là dùng gói bslib. Cách này cho phép bạn đặt trực tiếp màu nền, màu chữ và phông chữ, kể cả phông từ kho Google Fonts, ngay trong YAML.

output:
  html_document:
    theme:
      bg: "#FFFFFF"             # màu nền
      fg: "#1a1a1a"            # màu chữ
      primary: "#3b6ea5"       # màu nhấn (link, tiêu đề)
      base_font:
        google: "Be Vietnam Pro"   # phông chữ lấy từ Google Fonts

Cách bslib đặc biệt hữu ích cho người dùng tiếng Việt, vì bạn có thể chỉ định một phông Google Fonts hỗ trợ dấu tiếng Việt tốt như Be Vietnam Pro, tránh được lỗi hiển thị dấu mà không cần viết CSS riêng.

6 CSS chuyên sâu

Đây là phần trọng tâm, nơi bạn học cách kiểm soát hình thức ở mức chi tiết nhất. CSS, viết tắt của Cascading Style Sheets, là ngôn ngữ quy định cách hiển thị của các phần tử trên một trang web. Hãy hình dung tài liệu HTML là một ngôi nhà thô, còn CSS là toàn bộ phần trang trí nội thất quy định màu tường, kiểu chữ và khoảng cách.

6.1 Ba cách đưa CSS vào tài liệu

Cách thứ nhất, tiện cho thử nghiệm nhanh, là tạo một khối code đặc biệt loại css ngay trong tệp. Khi đặt tùy chọn echo=FALSE, đoạn CSS sẽ không hiện ra như chữ mà được nhúng vào trang dưới dạng quy tắc trang trí. Cách thứ hai là tách CSS ra một tệp riêng có đuôi .css rồi khai báo trong YAML, giúp tái sử dụng cho nhiều tài liệu. Cách thứ ba là viết thẳng thuộc tính vào một thẻ HTML, chỉ nên dùng cho điều chỉnh lẻ.

output:
  html_document:
    css: style.css        # dùng một tệp CSS riêng

6.2 Selector: cách CSS biết tác động lên cái gì

Mỗi quy tắc CSS gồm hai phần: một selector cho biết tác động lên phần tử nào, và một khối thuộc tính cho biết thay đổi gì. Hãy hình dung selector như địa chỉ, còn thuộc tính như nội dung công việc cần làm tại địa chỉ đó. Có ba loại selector cơ bản. Selector theo thẻ nhắm vào mọi phần tử cùng loại, ví dụ mọi đoạn văn. Selector theo lớp, bắt đầu bằng dấu chấm, nhắm vào những phần tử được gán lớp đó. Selector theo định danh, bắt đầu bằng dấu thăng, nhắm vào một phần tử duy nhất.

p            { color: #333; }      /* mọi đoạn văn */
h2           { color: #3b6ea5; }   /* mọi tiêu đề cấp 2 */
.note        { background: #eef; } /* mọi phần tử có lớp "note" */
#tom-tat     { font-weight: bold; }/* phần tử có định danh "tom-tat" */

6.3 Độ ưu tiên: vì sao quy tắc của bạn đôi khi không có tác dụng

Đây là điểm mà người mới hay bối rối nhất, và chính nhóm tác giả R Markdown cũng nhấn mạnh rằng hiểu selector cùng độ ưu tiên của quy tắc là điều cực kỳ quan trọng. Vấn đề nảy sinh khi nhiều quy tắc cùng nhắm vào một phần tử nhưng mâu thuẫn nhau. Khi đó trình duyệt phải chọn một, và nó chọn theo độ ưu tiên, gọi là specificity. Quy tắc càng cụ thể thì càng thắng: selector theo định danh mạnh hơn selector theo lớp, và selector theo lớp mạnh hơn selector theo thẻ.

Điều này giải thích vì sao đôi khi bạn viết một quy tắc mà nó không ăn: rất có thể theme đang áp một quy tắc cụ thể hơn của bạn. Trong trường hợp đó, bạn có thể tăng độ cụ thể của selector, hoặc dùng từ khóa !important để ép quy tắc thắng. Tuy nhiên nên dùng !important một cách dè dặt, vì lạm dụng sẽ khiến về sau khó kiểm soát.

p { color: blue !important; }   /* ép quy tắc này thắng mọi quy tắc khác cho p */

6.4 Gỡ rối CSS bằng công cụ của trình duyệt

May mắn là bạn không phải đoán mò. Mọi trình duyệt đều có sẵn công cụ kiểm tra. Sau khi kết xuất tài liệu, bạn mở nó trong trình duyệt, nhấp chuột phải vào phần tử cần chỉnh rồi chọn Inspect. Một bảng sẽ hiện ra cho thấy chính xác những quy tắc CSS nào đang áp lên phần tử đó, quy tắc nào đang thắng và quy tắc nào bị gạch ngang vì thua độ ưu tiên. Đây là cách nhanh nhất để hiểu vì sao tài liệu trông như hiện tại và cần sửa selector nào.

6.5 Phông chữ, cỡ chữ và khoảng cách dòng

Ba thuộc tính typography quan trọng nhất là phông chữ, cỡ chữ và khoảng cách dòng. Để dùng một phông từ Google Fonts, bạn nhập nó ở đầu khối CSS rồi khai báo cho phần thân tài liệu.

@import url('https://fonts.googleapis.com/css2?family=Be+Vietnam+Pro&display=swap');

body {
  font-family: 'Be Vietnam Pro', sans-serif;
  font-size: 1rem;        /* dùng rem thay vì px để chữ co giãn theo cài đặt người đọc */
  line-height: 1.7;       /* khoảng cách dòng, 1.6 đến 1.8 thường dễ đọc */
}

Vì sao nên dùng đơn vị rem thay vì px. Đơn vị px là cố định, còn rem co giãn theo cỡ chữ gốc mà người đọc cài đặt trong trình duyệt. Dùng rem giúp tài liệu thân thiện hơn với người cần chữ lớn và hiển thị tốt trên nhiều màn hình.

6.6 Màu sắc và một bảng màu nhất quán

Để tài liệu trông chuyên nghiệp, màu sắc nên nhất quán thay vì mỗi nơi một kiểu. CSS hiện đại cho phép khai báo các biến màu một lần rồi dùng lại khắp nơi, nên khi muốn đổi tông bạn chỉ sửa một chỗ.

:root {
  --mau-chinh: #3b6ea5;     /* khai báo biến màu một lần */
  --mau-chu:   #1a1a1a;
}
body { color: var(--mau-chu); }
h1, h2, h3 { color: var(--mau-chinh); }
a { color: var(--mau-chinh); }

6.7 SCSS và biến của theme

Khi đã quen, bạn có thể đi xa hơn với SCSS, một bản mở rộng của CSS cho phép dùng biến, phép tính và lồng quy tắc, giúp quản lý style phức tạp gọn gàng hơn. Với theme dựa trên Bootstrap, bạn có thể cung cấp một tệp .scss tận dụng được các biến và tiện ích sẵn có của theme. Đây là mức nâng cao, và bạn chỉ nên chạm tới khi nhu cầu tùy biến vượt quá những gì CSS thường đáp ứng được.

7 Bố cục và thành phần trình bày

7.1 Tổ chức nội dung bằng tab

Khi có nhiều phần song song mà bạn không muốn người đọc phải cuộn dài, bạn có thể gom chúng vào các tab. Cách làm là thêm thuộc tính .tabset vào một tiêu đề; mọi tiêu đề con một cấp thấp hơn sẽ biến thành các tab. Bạn kết thúc vùng tab bằng một tiêu đề trống không đánh số. Ví dụ dưới đây tạo ra tab thật ngay trong tài liệu này.

7.2 Ví dụ về tab

7.2.1 Mô tả

Đây là nội dung của tab thứ nhất. Người đọc bấm vào tên tab để chuyển qua lại mà không phải cuộn trang.

7.2.2 Số liệu

Đây là nội dung của tab thứ hai. Mỗi tiêu đề cấp ba trong vùng này trở thành một tab riêng.

Đoạn code tạo ra hiệu ứng trên trông như sau. Bạn có thể thêm .tabset-pills để tab có dạng nút bo tròn.

## Ví dụ về tab {.tabset}
### Mô tả
Nội dung tab một.
### Số liệu
Nội dung tab hai.
## {-}

7.3 Hộp chú thích bằng fenced Div

Những hộp màu mà bạn đã thấy nhiều lần trong tài liệu này được tạo bằng một kỹ thuật gọn gàng tên là fenced Div, tức là một khối bao bởi ba dấu hai chấm kèm tên lớp. Khi kết xuất, khối này trở thành một vùng HTML mang lớp đó, và bạn dùng CSS để trang trí cho lớp. Đây là cách làm callout sạch hơn nhiều so với viết thẻ HTML thô.

::: {.note}
Đây là một hộp chú thích. Lớp "note" đã được định nghĩa kiểu trong khối CSS.
:::

Trên thực tế, ở đầu tài liệu này có một khối CSS định nghĩa ba lớp note, tip và warn với màu nền và viền khác nhau, và mọi hộp bạn thấy đều dùng đúng ba lớp đó.

7.4 Bố cục nhiều cột

Khi muốn đặt hai khối cạnh nhau, bạn có thể lồng các fenced Div và dùng một kỹ thuật CSS tên flexbox để xếp chúng thành hàng ngang. Cách này hữu ích khi muốn đặt biểu đồ bên cạnh phần diễn giải.

:::: {style="display: flex; gap: 1em;"}
::: {style="flex: 1;"}
Nội dung cột trái.
:::
::: {style="flex: 1;"}
Nội dung cột phải.
:::
::::

8 Code chunk và kết quả động

8.1 Các tùy chọn chunk quan trọng

Mỗi khối code có thể được tinh chỉnh bằng các tùy chọn đặt trong phần khai báo của nó. Hiểu vài tùy chọn cốt lõi là đủ cho hầu hết nhu cầu. Tùy chọn echo quyết định có hiển thị code hay không. Tùy chọn eval quyết định có chạy code hay không. Tùy chọn include khi đặt sai sẽ chạy code nhưng giấu cả code lẫn kết quả, hữu ích cho bước chuẩn bị. Hai tùy chọn messagewarning cho phép ẩn các thông báo và cảnh báo để báo cáo gọn gàng.

8.2 Tùy chọn cho hình ảnh

Khi một chunk vẽ biểu đồ, bạn điều chỉnh hình bằng các tùy chọn riêng. fig.cap thêm chú thích, fig.align căn lề, còn fig.widthfig.height quy định kích thước. Ví dụ dưới đây chạy thật, dùng hàm vẽ cơ bản của R để không phụ thuộc gói nào.

plot(mtcars$wt, mtcars$mpg,
     xlab = "Trọng lượng", ylab = "Mức tiêu hao (mpg)",
     pch = 19, col = "#3b6ea5")
Quan hệ giữa trọng lượng và mức tiêu hao nhiên liệu

Quan hệ giữa trọng lượng và mức tiêu hao nhiên liệu

8.3 Code nội dòng: sức mạnh thật sự của tài liệu động

Đây là tính năng phân biệt R Markdown với một báo cáo gõ tay trong Word. Bạn có thể nhúng một giá trị tính toán thẳng vào câu văn, để khi dữ liệu thay đổi thì con số trong văn bản tự cập nhật theo, không bao giờ lệch. Cách làm là đặt biểu thức R giữa hai dấu huyền kèm chữ r.

Ví dụ, câu sau có một con số được tính tự động: bộ dữ liệu mtcars có 32 dòng. Con số này không phải mình gõ tay, mà do R đếm khi kết xuất. Nếu dữ liệu đổi, câu văn đổi theo.

8.4 Bảng đẹp từ kết quả tính toán

Để biến một bảng dữ liệu thô thành bảng trình bày đẹp, công cụ đơn giản nhất là hàm knitr::kable. Khi cần bảng phức tạp hơn với tiêu đề nhóm hay tô màu có điều kiện, bạn dùng thêm gói kableExtra hoặc gói gt. Ví dụ dưới đây dùng kable và chạy thật.

knitr::kable(head(mtcars, 5),
             caption = "Năm dòng đầu của mtcars, trình bày bằng kable")
Năm dòng đầu của mtcars, trình bày bằng kable
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2

Có nhiều gói làm bảng và mỗi gói mạnh ở một việc. Với người mới, hãy bắt đầu bằng kable cho bảng tĩnh đơn giản, rồi học gt khi cần bảng phức tạp, và DT khi cần bảng tương tác có ô tìm kiếm.

9 Tùy biến nâng cao

Phần này dành cho khi nhu cầu của bạn vượt quá những gì CSS và YAML thông thường đáp ứng được. Bạn không nhất thiết phải dùng ngay, nhưng biết rằng chúng tồn tại sẽ hữu ích về sau.

9.1 Chèn nội dung HTML vào tài liệu

Tùy chọn includes trong YAML cho phép chèn các đoạn HTML vào những vị trí cố định: vào phần đầu trang, vào ngay trước phần thân, hoặc vào cuối phần thân. Đây là cách thêm những thứ như mã phân tích truy cập, một thanh điều hướng tùy chỉnh, hay một chân trang.

output:
  html_document:
    includes:
      in_header: phan-dau.html
      after_body: chan-trang.html

9.2 Thay thế khuôn mẫu Pandoc

Ở mức sâu nhất, bạn có thể thay toàn bộ khuôn mẫu mà Pandoc dùng để dựng trang HTML, bằng tùy chọn template. Nhóm tác giả R Markdown lưu ý rằng đừng đánh giá thấp khả năng tùy biến của công cụ này: khuôn mẫu Pandoc có thể mạnh đến bất ngờ, miễn là bạn hiểu các công nghệ nền như CSS và sẵn lòng đầu tư thời gian. Tuy nhiên đây là mức dành cho người đã vững, và với phần lớn báo cáo thì YAML cùng CSS đã quá đủ.

10 Template tái sử dụng

Sau khi đã dày công định dạng một tài liệu ưng ý, bạn sẽ không muốn làm lại từ đầu mỗi lần. Giải pháp là tạo một template, tức một tệp khung sườn để tái sử dụng.

Cách đơn giản nhất là lưu một tệp .Rmd mẫu, trong đó đã có sẵn phần YAML chuẩn hóa, một khối setup chuẩn, một khối CSS chuẩn, và cấu trúc tiêu đề khung. Mỗi khi bắt đầu tài liệu mới, bạn sao chép tệp này rồi điền nội dung vào. Ở mức bài bản hơn, bạn có thể đóng gói template thành một mẫu xuất hiện trong trình đơn tạo tài liệu mới của RStudio, qua đường dẫn tạo tệp từ template. Mức này đòi hỏi một cấu trúc thư mục nhất định nhưng không cần xuất bản gì ra ngoài, và phù hợp khi bạn muốn dùng chung một bộ định dạng cho nhiều dự án.

11 Hoàn thiện và xuất bản

Trước khi xuất bản, hãy rà soát vài điểm để tránh các lỗi thường gặp. Thứ nhất là mã hóa ký tự: hãy đảm bảo tệp được lưu ở dạng UTF-8 và dấu tiếng Việt ở dạng dính liền, để không bị lỗi hiển thị dấu. Thứ hai là khả năng chạy lại: hãy chắc rằng tài liệu kết xuất được từ một phiên làm việc sạch, vì kết xuất thành công là bằng chứng tài liệu thật sự ổn. Thứ ba là đường dẫn: tránh dùng đường dẫn tuyệt đối gắn với ổ đĩa của riêng bạn. Thứ tư là tính tự chứa: với tài liệu sẽ chia sẻ, nên giữ chế độ tự chứa để mọi thành phần nằm trong một tệp.

Khi đã sẵn sàng, quy trình xuất bản lên RPubs diễn ra như sau. Bạn kết xuất tài liệu ra HTML, rồi trên khung xem trước, nhấn nút Publish ở góc trên bên phải và chọn RPubs. Trình duyệt sẽ mở để bạn đăng nhập hoặc tạo tài khoản miễn phí, sau đó điền tiêu đề và xác nhận để nhận đường liên kết chia sẻ. Cần nhớ rằng tệp nguồn phải nằm trong một thư mục con cụ thể chứ không đặt ngay tại gốc ổ đĩa.

12 Phụ lục

12.1 Bảng tham số YAML thường dùng

Tham số Tác dụng Giá trị ví dụ
toc Tạo mục lục true / false
toc_float Mục lục nổi khi cuộn true / false
toc_depth Mục lục sâu đến cấp nào 2, 3
number_sections Tự đánh số mục true / false
theme Giao diện tổng thể flatly, readable, cosmo
highlight Tô màu code tango, kate, espresso
code_folding Ẩn hiện code show / hide
df_print Cách in bảng dữ liệu paged, kable, tibble
css Tệp CSS riêng “style.css”

12.2 Bảng tùy chọn chunk thường dùng

Tùy chọn Tác dụng
echo Hiển thị code hay không
eval Chạy code hay không
include Chạy nhưng giấu cả code lẫn kết quả
message Ẩn thông báo
warning Ẩn cảnh báo
fig.cap Chú thích hình
fig.align Căn lề hình
fig.width, fig.height Kích thước hình
cache Lưu kết quả để khỏi chạy lại

12.3 Bảng selector CSS cơ bản

Selector Nhắm vào Ví dụ
tag Mọi phần tử cùng loại p, h2, a
.lop Phần tử có lớp đó .note
#dinhdanh Một phần tử duy nhất #tom-tat
cha con Phần tử con bên trong cha .note p

13 Kết luận

Tài liệu này đã đi qua toàn bộ chặng đường định dạng một tài liệu R Markdown, từ việc hiểu cơ chế ba lớp, qua cú pháp văn bản và các tùy chọn YAML, đến giao diện dựng sẵn, rồi đào sâu vào CSS với selector, độ ưu tiên và công cụ gỡ rối, cuối cùng là bố cục, code chunk, tùy biến nâng cao và cách tái sử dụng qua template. Điều quan trọng nhất cần mang theo là mô hình ba lớp ở đầu tài liệu: một khi bạn biết mỗi loại điều chỉnh thuộc về lớp nào, việc định dạng không còn là chuyện thử sai may rủi, mà trở thành một quy trình rõ ràng và kiểm soát được. Hãy bắt đầu từ những thứ đơn giản như chọn theme và viết vài quy tắc CSS nhỏ, rồi mở rộng dần khi đã quen tay.