Hai cách dùng R: console và script
R có một console tương tác (một REPL: đọc, tính, in, lặp lại): bạn gõ một biểu thức, R trả lời ngay. Gõ R trong terminal, hoặc nhìn vào khung dưới của RStudio, bạn sẽ thấy dấu nhắc >, nơi mỗi dòng chạy ngay khi bạn nhấn Enter. Console là nơi để khám phá: xem thử dữ liệu, thử một dòng, nhìn kết quả.
Một script R chỉ là một tệp văn bản thuần chứa code R, lưu với đuôi .R. Script là nơi phân tích sống: một công thức có thể tái lập mà bất kỳ ai (kể cả bạn trong tương lai) đều chạy được từ đầu đến cuối và nhận cùng một kết quả.
Script chẳng có gì kỳ bí. Đây là một script hoàn chỉnh, hãy chạy thử:
Toàn bộ phần dưới đây nói về các cách khác nhau để đưa một tệp như vậy cho R chạy.
Rscript: chạy tệp từ dòng lệnh
R cài kèm một công cụ dòng lệnh tên là Rscript, được làm ra đúng cho việc này. Trong terminal, ở thư mục chứa tệp của bạn:
Rscript summary.R
R khởi động, chạy tệp từ đầu đến cuối, in ra những gì script in và thoát. Đây là công cụ chủ lực cho tự động hóa: cron job, pipeline dữ liệu, máy chủ, CI, bất cứ nơi nào code chạy mà không có người ngồi xem.
Có một hành vi khiến ai cũng bất ngờ một lần: ở console, gõ một biểu thức trần như avg sẽ tự động in giá trị của nó. Dưới Rscript, một biểu thức trần bên trong hàm hoặc vòng lặp có thể không in gì cả, vì thế script nói rõ ý mình bằng lệnh gọi cat() hoặc print(). Hãy tập thói quen đó sớm.
source(): chạy tệp từ bên trong R
Đang ở trong một phiên R và muốn thực thi một tệp? Đó là việc của source():
source("summary.R")
Mọi dòng của tệp chạy trong phiên hiện tại, và mọi thứ script định nghĩa (biến, hàm) vẫn còn lại sau đó. Đó chính là mục đích: source() là cách bạn nạp các hàm tiện ích của riêng mình vào một phiên tương tác.
Mặc định source() chạy im lặng, ngoại trừ phần đầu ra được in rõ ràng. Để xem nó chạy, hãy cho in lại từng dòng khi thực thi:
source("summary.R", echo = TRUE)
Lưu ý đường dẫn tương đối: "summary.R" nghĩa là "trong thư mục làm việc hiện tại", và đó là đâu thì tùy cách bạn khởi động R. Khi source() hay read.csv() bí ẩn không tìm thấy một tệp đang nằm ngay đó, thủ phạm gần như luôn là thư mục làm việc (working directory): xem bài working directory.
Chạy script trong RStudio
RStudio cho bạn cả hai chế độ qua hai lệnh, và sự khác biệt này đáng để nắm thật chắc:
- Run (Ctrl+Enter, Cmd+Enter trên macOS): thực thi dòng hiện tại hoặc đoạn đang bôi đen trong console. Đây là chế độ khám phá: viết một dòng, chạy, xem, chỉnh.
- Source (nút Source, hoặc Ctrl/Cmd+Shift+S): thực thi cả tệp, y như
source()ở console.
Cái bẫy của việc Run từng dòng là phiên console tích lũy trạng thái: biến từ những dòng bạn đã sửa hoặc xóa vẫn còn sống, nên script "chạy được" với bạn nhưng lỗi với mọi người khác. Phép thử trung thực cho một script là Source trong một phiên mới (Session → Restart R, rồi Source). Nếu vượt qua được, script đó tái lập được.
Biến script thành tệp thực thi được (macOS / Linux)
Trên các hệ thống kiểu Unix, bạn có thể biến một script R thành một lệnh riêng. Đặt một dòng shebang ở ngay đầu tệp:
#!/usr/bin/env Rscript
cat("I am a self-running R script\n")
Sau đó đánh dấu nó thực thi được một lần, rồi chạy trực tiếp:
chmod +x summary.R
./summary.R
Shebang cho shell biết trình thông dịch nào chạy tệp; env Rscript tìm Rscript ở bất cứ đâu trong PATH của máy đó. Vì dòng này bắt đầu bằng #, bản thân R đọc nó như một chú thích và bỏ qua.
Truyền đối số cho script
Script thực tế nhận đầu vào (tên tệp, ngày tháng, ngưỡng) được truyền sau tên script:
Rscript report.R sales.csv 2026
Bên trong script, commandArgs(trailingOnly = TRUE) trả về các đối số của bạn dưới dạng vector character (trailingOnly = TRUE bỏ đi các đối số nội bộ của trình thông dịch, gần như lúc nào bạn cũng cần nó):
# report.R
args <- commandArgs(trailingOnly = TRUE)
input_file <- args[1]
year <- as.numeric(args[2])
cat("Reading:", input_file, "\n")
cat("Filtering to year:", year, "\n")
Mọi thứ đến dưới dạng văn bản, "2026" chứ không phải 2026, nên hãy chuyển bằng as.numeric() trước khi tính toán. Ta có thể mô phỏng phần xử lý đối số ở dạng chạy được:
Nên dùng cách nào?
- Khám phá dữ liệu, thử ý tưởng → console, hoặc Run trong RStudio.
- Thực thi toàn bộ phân tích → Source trong RStudio, hoặc
Rscripttrong terminal. - Nạp các hàm tiện ích vào một phiên →
source("helpers.R"). - Tự động hóa, bộ lập lịch, pipeline →
Rscript, kèmcommandArgs()cho đầu vào.
Cú pháp của những gì nằm bên trong các tệp đó là bài tiếp theo: xem cú pháp R.
Điều cần nhớ
- Console để khám phá; tệp script
.Rđể phân tích có thể tái lập. Rscript file.Rchạy script từ dòng lệnh;source("file.R")chạy nó trong một phiên (thêmecho = TRUEđể theo dõi).- Trong RStudio, Run thực thi một dòng; Source thực thi cả tệp, và Source trong một phiên mới là phép thử tái lập thật sự.
#!/usr/bin/env Rscriptcùngchmod +xbiến script thành tệp thực thi trực tiếp;commandArgs(trailingOnly = TRUE)đọc đối số của nó dưới dạng văn bản.
Tiếp theo: cú pháp của R, gồm phép gán với <-, lời gọi hàm và quy tắc mọi thứ đều là vector.
Câu hỏi thường gặp
Làm sao để chạy script R từ dòng lệnh?
Dùng lệnh Rscript đi kèm với R: Rscript analysis.R. Lệnh này chạy tệp từ đầu đến cuối và in ra mọi thứ script in ra. Đây là cách chuẩn để chạy R trong tác vụ định kỳ, pipeline và trên máy chủ.
Run và Source trong RStudio khác nhau thế nào?
Run (Ctrl/Cmd+Enter) chỉ thực thi dòng hiện tại hoặc đoạn đang chọn trong console, rất hợp khi khám phá dữ liệu. Source thực thi cả tệp một lượt, giống như Rscript. Source script trong một phiên sạch mới là phép thử thật sự để biết nó chạy được từ đầu đến cuối.
Hàm source() trong R làm gì?
source("script.R") đọc một tệp và thực thi từng dòng trong phiên R hiện tại, nên mọi biến và hàm mà tệp định nghĩa đều dùng được ngay sau đó. Thêm echo = TRUE để in ra từng dòng khi nó chạy.
Làm sao để truyền đối số cho script R?
Chạy Rscript script.R value1 value2, rồi đọc chúng trong script bằng args <- commandArgs(trailingOnly = TRUE). Phần trailingOnly = TRUE bỏ đi các đối số nội bộ của trình thông dịch và chỉ giữ lại đối số của bạn. Mọi thứ đến dưới dạng văn bản, nên hãy chuyển số bằng as.numeric().